This report has discussed the design and implementation of a complete environment for designing and simulating simple digital circuits at the logic level. By adopting sound design principles and by employing a high-level user interface toolkit, an intuitive front-end GUI was implemented for the layout component of the application. The creation of the GUI has dramatically increased the accessibility of the underlying simulator engine by enabling the user to interact with the circuit graphically instead of textually. The GUI also enables relatively complicated circuits to be created and simulated, thereby providing a more efficient means for verifying the correctness of new simulator engines.
The simulator engine described in this report employs distributed event queues for the purposes of event notification and signal propagation instead of the more conventional single global event queue. By using distributed queues, the circuit model more accurately represents its counterpart in the real world. The implementation of the simulator strategy was facilitated by the object-oriented paradigm. The support for encapsulation, inheritance and polymorphism provided by this paradigm made the implementation more natural and more resilient to change. The component class library was designed to be extensible; consequently, a viable foundation has been established upon which additional circuit elements can be derived and incorporated into the simulator engine, resulting in a more comprehensive component class library.
By cleanly separating the GUI from the simulator engine and having them communicate via a bidirectional pipe, future extensibility and reuse of the two software modules is realizable. In addition, a new GUI or new digital simulator engines can be added relatively seamlessly to the environment, provided they each conform to a mutual protocol for the purpose of information sharing. The clear distinction between the GUI and the simulator also makes it easier to modify the implementation of one of the modules without adversely affecting the other. The partitioning of the two modules may also serve to help distribute the execution of the software over several machines.