system_rust/lib.rs
1#![feature(random)]
2#![feature(slice_as_array)]
3#![allow(dead_code)]
4extern crate lazy_static;
5
6pub mod logic;
7pub mod module;
8pub mod ports;
9pub mod signal;
10pub mod simulation;
11
12pub mod prelude {
13 pub use crate::logic::L4;
14 pub use crate::module::{CompositeModule, ComputeModule, ModuleInterface};
15 pub use crate::ports::{SRIn, SRInArr, SROut, SROutArr};
16 pub use crate::signal::{
17 ResolvedSignal, ResolvedSignalArr, Signal, SignalArr,
18 };
19 pub use crate::simulation::{SimDelay, SimulationContext, SimulationControl, SimulationWaiter};
20}
21
22pub mod standard_modules;
23pub mod vcd_converter;
24
25/*
26Dokumentation
27* Architekturentscheidungen begründen
28* Das Dokument sollte ein grundlegendes Verständnis wie der Simulator funktioniert vermitteln
29* Wie begründen sich die Architekturentscheidungen aus Parallelen zu anderen Simulatoren.
30* LaTeX Template
31* Bilder mit guter Auflösung
32* UML Diagramme
33* Quellcode minimal halten (in Rust)
34* Overleaf Instanz der Uni oder Workshop
35* Abgabe und Verteidigung bis Ende September
36* Abgabe Probeversion 24.7.2025
37* Abgabe 29.8.2025
38* Verteidigung 8.9.2025
39* Umfang 10 - 15 Seiten
40
411. Grobe Architekturentscheidungen
422. Evaluation (Zeitkomplexität der Operationen und gemessener Vergleich)
433. Grundlagen schreiben. Grundlagen erst später schreiben, nur nach Bedarf für die anderen Kapitel. kurz.
444. Einleitung und Schlussteil: müssen zusammenpassen und die groben Inhalte vermittelt
455. Quellen (Zotero?, Jabref), Harvard-Style
46
47Things left to implement:
48 * Threads with wait() methods as opposed to everything being a process
49 * Aktuelles Problem: Ein Port ist nicht gesetzt. Vermutung: Wenn der Port einem anderen zugewiesen wird,
50 bleibt irgendwie noch der ursprüngliche Port in der sensitivitätsliste?
51 Es scheint nur ein Problem zu sein, wenn dem Port ein anderes signal zugewiesen ist wie in FullAdder.
52 → Lösung: Es lag an der Reihenfolge in der Ports zugewiesen werden, das muss ganz am Anfang passieren.
53
54Wie schaffe ich es, die Simulation nicht mit dem StopCommando abzubrechen sobald mal keine
55ereignisse für ein paar Millisekunden vorliegen
56
57Schwierigkeit bei der Implementierung:
58Wenn man einen Port an einen anderen Binden will und beide bereits existieren.
59Wenn man den Zugrundeliegenden State kopieren möchte, ist nicht klar, von welchem
60Port kopiert und welcher geschrieben werden soll. Wenn man sie zuweist, besteht
61diese Unklarheit weiterhin und zusätzlich lässt sich das pro Port jetzt nur einmal
62machen.
63 */
64
65#[cfg(test)]
66mod tests {
67 use crate::prelude::*;
68 use crate::standard_modules::TriState;
69
70 #[test]
71 fn it_works() {
72 let (mut sim_control, sim) = SimulationControl::new();
73 let bus = sim.create_resolved_signal("Bus", L4::Z);
74 let en_a = sim.create_signal("En_A", L4::F);
75 let en_b = sim.create_signal("En_B", L4::F);
76 let con_true = sim.create_signal("True", L4::T);
77 let con_false = sim.create_signal("False", L4::F);
78
79 sim.add_compute_module("TriA", |mut tri: TriState| {
80 tri.input.attach(&con_true);
81 tri.enable.attach(&en_a);
82 tri.output.attach_resolved(&bus);
83 tri
84 });
85 sim.add_compute_module("TriB", |mut tri: TriState| {
86 tri.input.attach(&con_false);
87 tri.enable.attach(&en_b);
88 tri.output.attach_resolved(&bus);
89 tri
90 });
91
92 sim_control.simulate(sim, |waiter| {
93 waiter.wait(SimDelay::NS(1));
94 assert_eq!(bus.read(), L4::Z);
95
96 en_a.write(L4::T);
97 waiter.wait(SimDelay::NS(1));
98 assert_eq!(bus.read(), L4::T);
99
100 en_a.write(L4::F);
101 waiter.wait(SimDelay::NS(1));
102 assert_eq!(bus.read(), L4::Z);
103
104 en_b.write(L4::T);
105 waiter.wait(SimDelay::NS(1));
106 assert_eq!(bus.read(), L4::F);
107
108 en_a.write(L4::T);
109 waiter.wait(SimDelay::NS(1));
110 assert_eq!(bus.read(), L4::X);
111
112 en_a.write(L4::F);
113 waiter.wait(SimDelay::NS(1));
114 assert_eq!(bus.read(), L4::F);
115 });
116 }
117}