digsim-logic-simulator 0.4.0__tar.gz → 0.8.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of digsim-logic-simulator might be problematic. Click here for more details.
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/LICENSE.md +1 -1
- {digsim-logic-simulator-0.4.0/src/digsim_logic_simulator.egg-info → digsim_logic_simulator-0.8.0}/PKG-INFO +16 -42
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/README.md +5 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/pyproject.toml +11 -10
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/app/gui/_circuit_area.py +2 -2
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/app/gui/_top_bar.py +1 -1
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/app/gui_objects/_component_object.py +7 -4
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/app/gui_objects/_hexdigit_object.py +1 -1
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/app/gui_objects/_image_objects.py +4 -2
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/app/model/_model.py +13 -14
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/app/model/_model_components.py +12 -15
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/app/model/_model_objects.py +29 -23
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/app/model/_model_settings.py +1 -5
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/app/model/_model_shortcuts.py +3 -3
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/app/settings/_component_settings.py +4 -4
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/circuit/_circuit.py +77 -98
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/circuit/_waves_writer.py +19 -8
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/circuit/components/_bus_bits.py +2 -2
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/circuit/components/_buzzer.py +1 -1
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/circuit/components/_clock.py +1 -1
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/circuit/components/_dip_switch.py +1 -1
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/circuit/components/_gates.py +5 -5
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/circuit/components/_hexdigit.py +2 -2
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/circuit/components/_label_wire.py +6 -6
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/circuit/components/_logic_analyzer.py +1 -1
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/circuit/components/_note.py +1 -1
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/circuit/components/_static_value.py +1 -1
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/circuit/components/atoms/__init__.py +2 -1
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/circuit/components/atoms/_component.py +40 -76
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/circuit/components/atoms/_port.py +74 -78
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/circuit/components/ic/74162.json +86 -85
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/circuit/components/ic/7448.json +62 -61
- digsim_logic_simulator-0.8.0/src/digsim/storage_model/__init__.py +7 -0
- digsim_logic_simulator-0.8.0/src/digsim/storage_model/_app.py +53 -0
- digsim_logic_simulator-0.8.0/src/digsim/storage_model/_circuit.py +118 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/utils/_yosys_netlist.py +3 -1
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0/src/digsim_logic_simulator.egg-info}/PKG-INFO +16 -42
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim_logic_simulator.egg-info/SOURCES.txt +3 -0
- digsim_logic_simulator-0.8.0/src/digsim_logic_simulator.egg-info/requires.txt +6 -0
- digsim-logic-simulator-0.4.0/src/digsim_logic_simulator.egg-info/requires.txt +0 -5
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/MANIFEST.in +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/setup.cfg +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/__init__.py +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/app/__main__.py +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/app/gui/__init__.py +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/app/gui/_component_selection.py +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/app/gui/_main_window.py +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/app/gui/_utils.py +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/app/gui/_warning_dialog.py +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/app/gui_objects/__init__.py +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/app/gui_objects/_bus_bit_object.py +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/app/gui_objects/_buzzer_object.py +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/app/gui_objects/_component_context_menu.py +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/app/gui_objects/_component_port_item.py +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/app/gui_objects/_dip_switch_object.py +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/app/gui_objects/_gui_note_object.py +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/app/gui_objects/_gui_object_factory.py +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/app/gui_objects/_label_object.py +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/app/gui_objects/_logic_analyzer_object.py +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/app/gui_objects/_seven_segment_object.py +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/app/gui_objects/_shortcut_objects.py +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/app/gui_objects/_yosys_object.py +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/app/gui_objects/images/AND.png +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/app/gui_objects/images/Analyzer.png +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/app/gui_objects/images/BUF.png +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/app/gui_objects/images/Buzzer.png +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/app/gui_objects/images/Clock.png +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/app/gui_objects/images/DFF.png +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/app/gui_objects/images/DIP_SWITCH.png +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/app/gui_objects/images/FlipFlop.png +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/app/gui_objects/images/IC.png +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/app/gui_objects/images/LED_OFF.png +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/app/gui_objects/images/LED_ON.png +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/app/gui_objects/images/MUX.png +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/app/gui_objects/images/NAND.png +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/app/gui_objects/images/NOR.png +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/app/gui_objects/images/NOT.png +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/app/gui_objects/images/ONE.png +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/app/gui_objects/images/OR.png +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/app/gui_objects/images/PB.png +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/app/gui_objects/images/Switch_OFF.png +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/app/gui_objects/images/Switch_ON.png +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/app/gui_objects/images/XNOR.png +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/app/gui_objects/images/XOR.png +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/app/gui_objects/images/YOSYS.png +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/app/gui_objects/images/ZERO.png +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/app/images/app_icon.png +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/app/model/__init__.py +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/app/model/_model_new_wire.py +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/app/settings/__init__.py +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/app/settings/_gui_settings.py +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/app/settings/_shortcut_dialog.py +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/circuit/__init__.py +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/circuit/components/__init__.py +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/circuit/components/_button.py +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/circuit/components/_flip_flops.py +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/circuit/components/_ic.py +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/circuit/components/_led.py +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/circuit/components/_mem64kbyte.py +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/circuit/components/_memstdout.py +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/circuit/components/_on_off_switch.py +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/circuit/components/_seven_segment.py +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/circuit/components/_static_level.py +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/circuit/components/_yosys_atoms.py +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/circuit/components/_yosys_component.py +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/circuit/components/atoms/_digsim_exception.py +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/synth/__init__.py +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/synth/__main__.py +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/synth/_synthesis.py +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/utils/__init__.py +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim_logic_simulator.egg-info/dependency_links.txt +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim_logic_simulator.egg-info/top_level.txt +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/tests/test_gates.py +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/tests/test_yosys_aldff.py +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/tests/test_yosys_dff.py +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/tests/test_yosys_dlatch.py +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/tests/test_yosys_gates.py +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/tests/test_yosys_latch.py +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/tests/test_yosys_netlist.py +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/tests/test_yosys_sdff.py +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/tests/test_yosys_sr.py +0 -0
- {digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/tests/test_yosys_synth.py +0 -0
|
@@ -1,60 +1,29 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: digsim-logic-simulator
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.8.0
|
|
4
4
|
Summary: Interactive Digital Logic Simulator
|
|
5
5
|
Author-email: Fredrik Andersson <freand@gmail.com>
|
|
6
6
|
Maintainer-email: Fredrik Andersson <freand@gmail.com>
|
|
7
|
-
License: The Clear BSD License
|
|
8
|
-
|
|
9
|
-
Copyright (c) 2023, Fredrik Andersson
|
|
10
|
-
All rights reserved.
|
|
11
|
-
|
|
12
|
-
Redistribution and use in source and binary forms, with or without
|
|
13
|
-
modification, are permitted provided that the following conditions are met:
|
|
14
|
-
|
|
15
|
-
* Redistributions of source code must retain the above copyright notice, this
|
|
16
|
-
list of conditions and the following disclaimer.
|
|
17
|
-
|
|
18
|
-
* Redistributions in binary form must reproduce the above copyright notice,
|
|
19
|
-
this list of conditions and the following disclaimer in the documentation
|
|
20
|
-
and/or other materials provided with the distribution.
|
|
21
|
-
|
|
22
|
-
* Neither the name of the copyright holder nor the names of its
|
|
23
|
-
contributors may be used to endorse or promote products derived from
|
|
24
|
-
this software without specific prior written permission.
|
|
25
|
-
|
|
26
|
-
NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY THIS
|
|
27
|
-
LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
28
|
-
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
|
29
|
-
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
30
|
-
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
|
31
|
-
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
32
|
-
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
|
33
|
-
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
34
|
-
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
35
|
-
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
|
36
|
-
OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
37
|
-
|
|
38
|
-
-------------------------------------------------------------------------------
|
|
39
|
-
|
|
40
7
|
Project-URL: homepage, https://github.com/freand76/digsim
|
|
41
8
|
Keywords: educational,simulation,digital
|
|
42
9
|
Classifier: Development Status :: 5 - Production/Stable
|
|
43
10
|
Classifier: Programming Language :: Python :: 3
|
|
44
|
-
Classifier: Programming Language :: Python :: 3.8
|
|
45
11
|
Classifier: Programming Language :: Python :: 3.9
|
|
46
12
|
Classifier: Programming Language :: Python :: 3.10
|
|
47
13
|
Classifier: Programming Language :: Python :: 3.11
|
|
48
14
|
Classifier: Programming Language :: Python :: 3.12
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
49
16
|
Classifier: Programming Language :: Python :: 3 :: Only
|
|
50
|
-
Requires-Python: >=3.
|
|
17
|
+
Requires-Python: >=3.9
|
|
51
18
|
Description-Content-Type: text/markdown
|
|
52
19
|
License-File: LICENSE.md
|
|
53
|
-
Requires-Dist: pyvcd
|
|
54
|
-
Requires-Dist: pyside6
|
|
55
|
-
Requires-Dist: pexpect==4.
|
|
56
|
-
Requires-Dist:
|
|
57
|
-
Requires-Dist:
|
|
20
|
+
Requires-Dist: pyvcd==0.4.1
|
|
21
|
+
Requires-Dist: pyside6==6.9.1
|
|
22
|
+
Requires-Dist: pexpect==4.9.0
|
|
23
|
+
Requires-Dist: pydantic==2.11.7
|
|
24
|
+
Requires-Dist: qtawesome==1.4.0
|
|
25
|
+
Requires-Dist: yowasp-yosys==0.55.0.0.post944
|
|
26
|
+
Dynamic: license-file
|
|
58
27
|
|
|
59
28
|
# DigSim - Interactive Digital Logic Simulator
|
|
60
29
|
|
|
@@ -135,6 +104,11 @@ Then the following package must be installed:
|
|
|
135
104
|
> gtkwave sr.vcd
|
|
136
105
|
```
|
|
137
106
|
|
|
107
|
+
### Examples of writing pytest/python test benches for synthesized verilog code
|
|
108
|
+
```
|
|
109
|
+
> pytest examples/pytest_tb
|
|
110
|
+
```
|
|
111
|
+
|
|
138
112
|
## Yosys synthesis helper tool
|
|
139
113
|
|
|
140
114
|
```
|
|
@@ -5,38 +5,39 @@ build-backend = "setuptools.build_meta"
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "digsim-logic-simulator"
|
|
7
7
|
description = "Interactive Digital Logic Simulator"
|
|
8
|
-
version = "0.
|
|
8
|
+
version = "0.8.0"
|
|
9
9
|
authors = [{name = "Fredrik Andersson", email = "freand@gmail.com"}]
|
|
10
10
|
maintainers = [{name = "Fredrik Andersson", email = "freand@gmail.com"}]
|
|
11
11
|
readme = "README.md"
|
|
12
|
-
license =
|
|
12
|
+
license-files = ["LICENSE.md"]
|
|
13
13
|
urls = { homepage = "https://github.com/freand76/digsim" }
|
|
14
14
|
|
|
15
15
|
classifiers = [
|
|
16
16
|
"Development Status :: 5 - Production/Stable",
|
|
17
17
|
"Programming Language :: Python :: 3",
|
|
18
|
-
"Programming Language :: Python :: 3.8",
|
|
19
18
|
"Programming Language :: Python :: 3.9",
|
|
20
19
|
"Programming Language :: Python :: 3.10",
|
|
21
20
|
"Programming Language :: Python :: 3.11",
|
|
22
21
|
"Programming Language :: Python :: 3.12",
|
|
22
|
+
"Programming Language :: Python :: 3.13",
|
|
23
23
|
"Programming Language :: Python :: 3 :: Only",
|
|
24
24
|
]
|
|
25
25
|
|
|
26
|
-
requires-python = ">=3.
|
|
26
|
+
requires-python = ">=3.9"
|
|
27
27
|
dependencies = [
|
|
28
|
-
"pyvcd
|
|
29
|
-
"pyside6
|
|
30
|
-
"pexpect==4.
|
|
31
|
-
"
|
|
32
|
-
"
|
|
28
|
+
"pyvcd==0.4.1",
|
|
29
|
+
"pyside6==6.9.1",
|
|
30
|
+
"pexpect==4.9.0",
|
|
31
|
+
"pydantic==2.11.7",
|
|
32
|
+
"qtawesome==1.4.0",
|
|
33
|
+
"yowasp-yosys==0.55.0.0.post944",
|
|
33
34
|
]
|
|
34
35
|
|
|
35
36
|
keywords = ["educational", "simulation", "digital"]
|
|
36
37
|
|
|
37
38
|
[tool.ruff]
|
|
38
39
|
line-length = 99
|
|
39
|
-
target-version = "
|
|
40
|
+
target-version = "py39"
|
|
40
41
|
|
|
41
42
|
show-fixes = true
|
|
42
43
|
output-format = "full"
|
{digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/app/gui/_circuit_area.py
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Copyright (c) Fredrik Andersson, 2023-
|
|
1
|
+
# Copyright (c) Fredrik Andersson, 2023-2025
|
|
2
2
|
# All rights reserved
|
|
3
3
|
|
|
4
4
|
"""The circuit area and component widget"""
|
|
@@ -275,7 +275,7 @@ class _CircuitAreaScene(QGraphicsScene):
|
|
|
275
275
|
component_objects = self._app_model.objects.components.get_object_list()
|
|
276
276
|
for src_comp_item in component_objects:
|
|
277
277
|
for src_port in src_comp_item.component.outports():
|
|
278
|
-
for dst_port in src_port.
|
|
278
|
+
for dst_port in src_port.wired_ports:
|
|
279
279
|
dst_comp_item = self._app_model.objects.components.get_object(
|
|
280
280
|
dst_port.parent()
|
|
281
281
|
)
|
{digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/app/gui/_top_bar.py
RENAMED
|
@@ -259,7 +259,7 @@ class LoadSaveWidget(QFrame):
|
|
|
259
259
|
self._redo_button.setToolTip("Redo")
|
|
260
260
|
self.layout().addWidget(self._redo_button)
|
|
261
261
|
self._settings_button = QPushButton("", self)
|
|
262
|
-
self._settings_button.setIcon(qta.icon("
|
|
262
|
+
self._settings_button.setIcon(qta.icon("mdi.cog"))
|
|
263
263
|
self._settings_button.clicked.connect(self._settings_dialog)
|
|
264
264
|
self._settings_button.setToolTip("Settings")
|
|
265
265
|
self.layout().addWidget(self._settings_button)
|
|
@@ -9,6 +9,8 @@ from PySide6.QtCore import QPoint, QRect, QSize, Qt
|
|
|
9
9
|
from PySide6.QtGui import QFont, QFontMetrics, QPen
|
|
10
10
|
from PySide6.QtWidgets import QGraphicsItem, QGraphicsRectItem
|
|
11
11
|
|
|
12
|
+
from digsim.storage_model import GuiPositionDataClass
|
|
13
|
+
|
|
12
14
|
from ._component_context_menu import ComponentContextMenu
|
|
13
15
|
from ._component_port_item import PortGraphicsItem
|
|
14
16
|
|
|
@@ -149,7 +151,7 @@ class ComponentObject(QGraphicsRectItem):
|
|
|
149
151
|
if port.width == 1:
|
|
150
152
|
self._port_dict[port]["name"] = port.name()
|
|
151
153
|
else:
|
|
152
|
-
self._port_dict[port]["name"] = f"{port.name()}[{port.width-1}:0]"
|
|
154
|
+
self._port_dict[port]["name"] = f"{port.name()}[{port.width - 1}:0]"
|
|
153
155
|
item = PortGraphicsItem(self._app_model, self, port)
|
|
154
156
|
self._port_dict[port]["item"] = item
|
|
155
157
|
self.update_ports()
|
|
@@ -365,6 +367,7 @@ class ComponentObject(QGraphicsRectItem):
|
|
|
365
367
|
"""Set zlevel"""
|
|
366
368
|
self.setZValue(level)
|
|
367
369
|
|
|
368
|
-
def
|
|
369
|
-
|
|
370
|
-
|
|
370
|
+
def to_gui_dataclass(self):
|
|
371
|
+
return GuiPositionDataClass(
|
|
372
|
+
x=int(self._save_pos.x()), y=int(self._save_pos.y()), z=int(self.zlevel)
|
|
373
|
+
)
|
|
@@ -22,7 +22,7 @@ class HexDigitObject(SevenSegmentObject):
|
|
|
22
22
|
def setup_size(self):
|
|
23
23
|
"""Setup the size of the component"""
|
|
24
24
|
self.digits = self.component.get_digits()
|
|
25
|
-
str_pixels_w, _ = self.get_string_metrics(f"val[{4*self.digits-1}:0]")
|
|
25
|
+
str_pixels_w, _ = self.get_string_metrics(f"val[{4 * self.digits - 1}:0]")
|
|
26
26
|
self.digit_left = self.inport_x_pos() + str_pixels_w + self.PORT_TO_RECT_MARGIN
|
|
27
27
|
self.digit_top = self.RECT_TO_DIGIT_RECT_MARGIN
|
|
28
28
|
self.width = (
|
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
|
|
4
4
|
"""A component with an image as symbol the GUI"""
|
|
5
5
|
|
|
6
|
+
from __future__ import annotations
|
|
7
|
+
|
|
6
8
|
from pathlib import Path
|
|
7
9
|
|
|
8
10
|
from PySide6.QtCore import QPoint, Qt
|
|
@@ -14,8 +16,8 @@ from ._component_object import ComponentObject
|
|
|
14
16
|
class ImageObject(ComponentObject):
|
|
15
17
|
"""The class for a image component placed in the GUI"""
|
|
16
18
|
|
|
17
|
-
IMAGE_FILENAME = None
|
|
18
|
-
ACTIVE_IMAGE_FILENAME = None
|
|
19
|
+
IMAGE_FILENAME: str | None = None
|
|
20
|
+
ACTIVE_IMAGE_FILENAME: str | None = None
|
|
19
21
|
_pixmap = None
|
|
20
22
|
_pixmap_active = None
|
|
21
23
|
|
{digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/app/model/_model.py
RENAMED
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
|
|
4
4
|
"""An application model for a GUI simulated circuit"""
|
|
5
5
|
|
|
6
|
-
import json
|
|
7
6
|
import queue
|
|
8
7
|
import time
|
|
9
8
|
from pathlib import Path
|
|
@@ -12,6 +11,7 @@ from PySide6.QtCore import QThread, Signal
|
|
|
12
11
|
|
|
13
12
|
from digsim.app.gui_objects import ComponentObject
|
|
14
13
|
from digsim.circuit.components.atoms import Component
|
|
14
|
+
from digsim.storage_model import AppFileDataClass
|
|
15
15
|
|
|
16
16
|
from ._model_objects import ModelObjects
|
|
17
17
|
from ._model_settings import ModelSettings
|
|
@@ -155,28 +155,27 @@ class AppModel(QThread):
|
|
|
155
155
|
def save_circuit(self, path):
|
|
156
156
|
"""Save the circuit with GUI information"""
|
|
157
157
|
circuit_folder = str(Path(path).parent)
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
158
|
+
model_dataclass = self.objects.circuit_to_model(circuit_folder)
|
|
159
|
+
appfile_dataclass = AppFileDataClass(
|
|
160
|
+
circuit=model_dataclass.circuit,
|
|
161
|
+
gui=model_dataclass.gui,
|
|
162
|
+
shortcuts=self.shortcuts.to_dict(),
|
|
163
|
+
settings=self.settings.get_all(),
|
|
164
|
+
)
|
|
165
|
+
appfile_dataclass.save(path)
|
|
166
166
|
self._changed = False
|
|
167
167
|
self.sig_control_notify.emit()
|
|
168
168
|
|
|
169
169
|
def load_circuit(self, path):
|
|
170
170
|
"""Load a circuit with GUI information"""
|
|
171
171
|
self._model_clear()
|
|
172
|
-
|
|
173
|
-
circuit_dict = json.load(json_file)
|
|
172
|
+
app_file_dc = AppFileDataClass.load(path)
|
|
174
173
|
circuit_folder = str(Path(path).parent)
|
|
175
174
|
if len(circuit_folder) == 0:
|
|
176
175
|
circuit_folder = "."
|
|
177
|
-
exception_str_list = self.objects.
|
|
178
|
-
self.shortcuts.from_dict(
|
|
179
|
-
self.settings.from_dict(
|
|
176
|
+
exception_str_list = self.objects.model_to_circuit(app_file_dc, circuit_folder)
|
|
177
|
+
self.shortcuts.from_dict(app_file_dc.shortcuts)
|
|
178
|
+
self.settings.from_dict(app_file_dc.settings)
|
|
180
179
|
self.model_init()
|
|
181
180
|
self._changed = False
|
|
182
181
|
self.objects.reset_undo_stack()
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Copyright (c) Fredrik Andersson, 2023
|
|
1
|
+
# Copyright (c) Fredrik Andersson, 2023-2024
|
|
2
2
|
# All rights reserved
|
|
3
3
|
|
|
4
4
|
"""Handle component objects in the model"""
|
|
@@ -7,6 +7,7 @@ import digsim.circuit.components
|
|
|
7
7
|
from digsim.app.gui_objects import ComponentObject
|
|
8
8
|
from digsim.circuit.components import Buzzer
|
|
9
9
|
from digsim.circuit.components.atoms import CallbackComponent
|
|
10
|
+
from digsim.storage_model import GuiPositionDataClass
|
|
10
11
|
|
|
11
12
|
|
|
12
13
|
class ModelComponents:
|
|
@@ -149,20 +150,16 @@ class ModelComponents:
|
|
|
149
150
|
self._circuit.delete_component(component_object.component)
|
|
150
151
|
self._app_model.sig_delete_component.emit(component_object)
|
|
151
152
|
|
|
152
|
-
def
|
|
153
|
+
def add_gui_positions(self, gui_dc_dict):
|
|
153
154
|
"""Create model components from circuit_dict"""
|
|
154
155
|
for comp in self._circuit.get_toplevel_components():
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
def get_circuit_dict(self):
|
|
164
|
-
"""Create model components dict"""
|
|
165
|
-
model_components_dict = {"gui": {}}
|
|
156
|
+
gui_dc = gui_dc_dict.get(comp.name(), GuiPositionDataClass())
|
|
157
|
+
component_object = self._add_object(comp, gui_dc.x, gui_dc.y)
|
|
158
|
+
component_object.zlevel = gui_dc.z
|
|
159
|
+
|
|
160
|
+
def get_gui_dict(self):
|
|
161
|
+
"""Return gui dict from component objects"""
|
|
162
|
+
gui_dict = {}
|
|
166
163
|
for comp, comp_object in self.get_dict().items():
|
|
167
|
-
|
|
168
|
-
return
|
|
164
|
+
gui_dict[comp.name()] = comp_object.to_gui_dataclass()
|
|
165
|
+
return gui_dict
|
{digsim-logic-simulator-0.4.0 → digsim_logic_simulator-0.8.0}/src/digsim/app/model/_model_objects.py
RENAMED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
from digsim.circuit import Circuit
|
|
7
7
|
from digsim.circuit.components.atoms import DigsimException
|
|
8
|
+
from digsim.storage_model import AppFileDataClass, ModelDataClass
|
|
8
9
|
|
|
9
10
|
from ._model_components import ModelComponents
|
|
10
11
|
from ._model_new_wire import NewWire
|
|
@@ -72,32 +73,37 @@ class ModelObjects:
|
|
|
72
73
|
self._app_model.model_changed()
|
|
73
74
|
self._app_model.sig_delete_wires.emit()
|
|
74
75
|
|
|
75
|
-
def
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
76
|
+
def model_to_circuit(self, model_dc, circuit_folder):
|
|
77
|
+
if isinstance(model_dc, AppFileDataClass):
|
|
78
|
+
# Loaded model
|
|
79
|
+
dc = ModelDataClass.from_app_file_dc(model_dc)
|
|
80
|
+
else:
|
|
81
|
+
dc = model_dc
|
|
81
82
|
|
|
82
|
-
def dict_to_circuit(self, circuit_dict, circuit_folder):
|
|
83
|
-
"""Convert dict to circuit and objects"""
|
|
84
|
-
exception_str_list = []
|
|
85
83
|
try:
|
|
86
|
-
|
|
87
|
-
|
|
84
|
+
# Create circuit
|
|
85
|
+
exception_str_list = self.circuit.from_dataclass(
|
|
86
|
+
dc.circuit,
|
|
87
|
+
circuit_folder,
|
|
88
|
+
component_exceptions=False,
|
|
89
|
+
connect_exceptions=False,
|
|
88
90
|
)
|
|
91
|
+
# Add component positions
|
|
92
|
+
self.components.add_gui_positions(dc.gui)
|
|
89
93
|
except DigsimException as exc:
|
|
90
94
|
self.sig_error.emit(f"Circuit error: {str(exc)}")
|
|
91
95
|
return exception_str_list
|
|
92
|
-
|
|
93
|
-
# Create GUI components
|
|
94
|
-
self.components.create_from_dict(circuit_dict)
|
|
95
|
-
|
|
96
96
|
return exception_str_list
|
|
97
97
|
|
|
98
|
-
def
|
|
98
|
+
def circuit_to_model(self, circuit_folder):
|
|
99
|
+
model_dc = ModelDataClass(
|
|
100
|
+
circuit=self.circuit.to_dataclass(circuit_folder), gui=self.components.get_gui_dict()
|
|
101
|
+
)
|
|
102
|
+
return model_dc
|
|
103
|
+
|
|
104
|
+
def _restore_state(self, model_dc):
|
|
99
105
|
self.clear()
|
|
100
|
-
exception_str_list = self.
|
|
106
|
+
exception_str_list = self.model_to_circuit(model_dc, None)
|
|
101
107
|
self._app_model.model_init()
|
|
102
108
|
self._app_model.model_changed()
|
|
103
109
|
if len(exception_str_list) > 0:
|
|
@@ -111,7 +117,7 @@ class ModelObjects:
|
|
|
111
117
|
|
|
112
118
|
def push_undo_state(self, clear_redo_stack=True):
|
|
113
119
|
"""Push undo state to stack"""
|
|
114
|
-
self._undo_stack.append(self.
|
|
120
|
+
self._undo_stack.append(self.circuit_to_model("/"))
|
|
115
121
|
if clear_redo_stack:
|
|
116
122
|
self._redo_stack = []
|
|
117
123
|
self._app_model.sig_control_notify.emit()
|
|
@@ -124,14 +130,14 @@ class ModelObjects:
|
|
|
124
130
|
|
|
125
131
|
def push_redo_state(self):
|
|
126
132
|
"""Push redo state to stack"""
|
|
127
|
-
self._redo_stack.append(self.
|
|
133
|
+
self._redo_stack.append(self.circuit_to_model("/"))
|
|
128
134
|
|
|
129
135
|
def undo(self):
|
|
130
136
|
"""Undo to last saved state"""
|
|
131
137
|
if len(self._undo_stack) > 0:
|
|
132
138
|
self.push_redo_state()
|
|
133
|
-
|
|
134
|
-
self._restore_state(
|
|
139
|
+
model_dc = self._undo_stack.pop()
|
|
140
|
+
self._restore_state(model_dc)
|
|
135
141
|
self._app_model.sig_control_notify.emit()
|
|
136
142
|
self._app_model.sig_synchronize_gui.emit()
|
|
137
143
|
|
|
@@ -139,8 +145,8 @@ class ModelObjects:
|
|
|
139
145
|
"""Undo to last saved state"""
|
|
140
146
|
if len(self._redo_stack) > 0:
|
|
141
147
|
self.push_undo_state(clear_redo_stack=False)
|
|
142
|
-
|
|
143
|
-
self._restore_state(
|
|
148
|
+
model_dc = self._redo_stack.pop()
|
|
149
|
+
self._restore_state(model_dc)
|
|
144
150
|
self._app_model.sig_control_notify.emit()
|
|
145
151
|
self._app_model.sig_synchronize_gui.emit()
|
|
146
152
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Copyright (c) Fredrik Andersson, 2023
|
|
1
|
+
# Copyright (c) Fredrik Andersson, 2023-2024
|
|
2
2
|
# All rights reserved
|
|
3
3
|
|
|
4
4
|
"""Handle settings in the model"""
|
|
@@ -25,10 +25,6 @@ class ModelSettings:
|
|
|
25
25
|
"""Return settings dict"""
|
|
26
26
|
return self._settings
|
|
27
27
|
|
|
28
|
-
def to_dict(self):
|
|
29
|
-
"""Return settings dict to save"""
|
|
30
|
-
return {"settings": self._settings}
|
|
31
|
-
|
|
32
28
|
def from_dict(self, circuit_dict):
|
|
33
29
|
"""Get settings from circuit dict"""
|
|
34
30
|
for key, data in circuit_dict.get("settings", {}).items():
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Copyright (c) Fredrik Andersson, 2023
|
|
1
|
+
# Copyright (c) Fredrik Andersson, 2023-2024
|
|
2
2
|
# All rights reserved
|
|
3
3
|
|
|
4
4
|
"""Handle shortcuts in the model"""
|
|
@@ -72,9 +72,9 @@ class ModelShortcuts:
|
|
|
72
72
|
|
|
73
73
|
def to_dict(self):
|
|
74
74
|
"""Generate dict from shortcuts"""
|
|
75
|
-
shortcuts_dict = {
|
|
75
|
+
shortcuts_dict = {}
|
|
76
76
|
for key, component in self._shortcut_component.items():
|
|
77
|
-
shortcuts_dict[
|
|
77
|
+
shortcuts_dict[key] = component.name()
|
|
78
78
|
return shortcuts_dict
|
|
79
79
|
|
|
80
80
|
def from_dict(self, model_dict):
|
|
@@ -358,9 +358,9 @@ class ComponentSettingsDialog(QDialog):
|
|
|
358
358
|
widget = ComponentSettingsCheckBoxWidthBool(
|
|
359
359
|
self, parameter, parameter_dict, self._settings
|
|
360
360
|
)
|
|
361
|
-
elif parameter_dict["type"] == int:
|
|
361
|
+
elif parameter_dict["type"] == "int":
|
|
362
362
|
widget = ComponentSettingsSlider(self, parameter, parameter_dict, self._settings)
|
|
363
|
-
elif parameter_dict["type"] == str:
|
|
363
|
+
elif parameter_dict["type"] == "str":
|
|
364
364
|
single_line = parameter_dict.get("single_line", False)
|
|
365
365
|
if single_line:
|
|
366
366
|
widget = ComponentSettingSingleLineText(
|
|
@@ -368,7 +368,7 @@ class ComponentSettingsDialog(QDialog):
|
|
|
368
368
|
)
|
|
369
369
|
else:
|
|
370
370
|
widget = ComponentSettingText(self, parameter, parameter_dict, self._settings)
|
|
371
|
-
elif parameter_dict["type"] == bool:
|
|
371
|
+
elif parameter_dict["type"] == "bool":
|
|
372
372
|
widget = ComponentSettingsCheckBox(self, parameter, parameter_dict, self._settings)
|
|
373
373
|
elif parameter_dict["type"] == "intrange":
|
|
374
374
|
widget = ComponentSettingsIntRangeSlider(
|
|
@@ -382,7 +382,7 @@ class ComponentSettingsDialog(QDialog):
|
|
|
382
382
|
widget = ComponentSettingsNameSelector(
|
|
383
383
|
self, parameter, parameter_dict, self._settings
|
|
384
384
|
)
|
|
385
|
-
elif parameter_dict["type"] == list:
|
|
385
|
+
elif parameter_dict["type"] == "list":
|
|
386
386
|
widget = ComponentSettingsListSelector(
|
|
387
387
|
self, parameter, parameter_dict, self._settings
|
|
388
388
|
)
|