digsim-logic-simulator 0.3.0__tar.gz → 0.7.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.

Files changed (123) hide show
  1. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/LICENSE.md +1 -1
  2. {digsim-logic-simulator-0.3.0/src/digsim_logic_simulator.egg-info → digsim_logic_simulator-0.7.0}/PKG-INFO +17 -10
  3. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/README.md +5 -0
  4. digsim_logic_simulator-0.7.0/pyproject.toml +83 -0
  5. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/__init__.py +1 -1
  6. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/app/__main__.py +1 -1
  7. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/app/gui/__init__.py +1 -1
  8. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/app/gui/_circuit_area.py +1 -6
  9. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/app/gui/_component_selection.py +1 -3
  10. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/app/gui/_main_window.py +1 -3
  11. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/app/gui/_top_bar.py +2 -5
  12. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/app/gui/_warning_dialog.py +1 -3
  13. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/app/gui_objects/__init__.py +1 -1
  14. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/app/gui_objects/_bus_bit_object.py +2 -5
  15. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/app/gui_objects/_buzzer_object.py +1 -1
  16. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/app/gui_objects/_component_context_menu.py +2 -2
  17. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/app/gui_objects/_component_object.py +9 -11
  18. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/app/gui_objects/_component_port_item.py +1 -1
  19. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/app/gui_objects/_dip_switch_object.py +2 -5
  20. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/app/gui_objects/_gui_note_object.py +1 -1
  21. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/app/gui_objects/_gui_object_factory.py +1 -1
  22. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/app/gui_objects/_hexdigit_object.py +2 -2
  23. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/app/gui_objects/_image_objects.py +2 -4
  24. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/app/gui_objects/_label_object.py +1 -1
  25. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/app/gui_objects/_logic_analyzer_object.py +1 -2
  26. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/app/gui_objects/_seven_segment_object.py +2 -4
  27. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/app/gui_objects/_shortcut_objects.py +2 -4
  28. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/app/gui_objects/_yosys_object.py +1 -1
  29. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/app/model/__init__.py +1 -1
  30. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/app/model/_model.py +15 -18
  31. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/app/model/_model_components.py +12 -15
  32. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/app/model/_model_objects.py +30 -26
  33. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/app/model/_model_settings.py +1 -5
  34. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/app/model/_model_shortcuts.py +3 -3
  35. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/app/settings/__init__.py +1 -1
  36. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/app/settings/_component_settings.py +5 -7
  37. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/app/settings/_gui_settings.py +1 -3
  38. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/app/settings/_shortcut_dialog.py +1 -3
  39. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/circuit/__init__.py +1 -1
  40. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/circuit/_circuit.py +21 -64
  41. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/circuit/_waves_writer.py +1 -4
  42. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/circuit/components/__init__.py +1 -1
  43. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/circuit/components/_bus_bits.py +2 -2
  44. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/circuit/components/_button.py +1 -1
  45. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/circuit/components/_buzzer.py +2 -2
  46. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/circuit/components/_clock.py +2 -2
  47. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/circuit/components/_dip_switch.py +2 -2
  48. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/circuit/components/_gates.py +7 -9
  49. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/circuit/components/_hexdigit.py +3 -3
  50. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/circuit/components/_ic.py +1 -0
  51. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/circuit/components/_label_wire.py +4 -4
  52. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/circuit/components/_led.py +1 -1
  53. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/circuit/components/_logic_analyzer.py +2 -2
  54. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/circuit/components/_note.py +1 -1
  55. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/circuit/components/_on_off_switch.py +1 -1
  56. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/circuit/components/_seven_segment.py +2 -1
  57. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/circuit/components/_static_level.py +1 -1
  58. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/circuit/components/_static_value.py +2 -2
  59. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/circuit/components/_yosys_atoms.py +1 -6
  60. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/circuit/components/_yosys_component.py +1 -4
  61. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/circuit/components/atoms/__init__.py +1 -1
  62. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/circuit/components/atoms/_component.py +2 -44
  63. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/circuit/components/atoms/_port.py +7 -18
  64. digsim_logic_simulator-0.7.0/src/digsim/storage_model/__init__.py +7 -0
  65. digsim_logic_simulator-0.7.0/src/digsim/storage_model/_app.py +53 -0
  66. digsim_logic_simulator-0.7.0/src/digsim/storage_model/_circuit.py +118 -0
  67. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/synth/__init__.py +1 -1
  68. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/synth/__main__.py +1 -1
  69. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/synth/_synthesis.py +10 -2
  70. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/utils/__init__.py +1 -1
  71. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/utils/_yosys_netlist.py +1 -1
  72. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0/src/digsim_logic_simulator.egg-info}/PKG-INFO +17 -10
  73. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim_logic_simulator.egg-info/SOURCES.txt +3 -0
  74. digsim_logic_simulator-0.7.0/src/digsim_logic_simulator.egg-info/requires.txt +6 -0
  75. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/tests/test_gates.py +2 -1
  76. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/tests/test_yosys_aldff.py +2 -2
  77. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/tests/test_yosys_dff.py +2 -2
  78. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/tests/test_yosys_dlatch.py +2 -2
  79. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/tests/test_yosys_gates.py +2 -2
  80. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/tests/test_yosys_latch.py +2 -2
  81. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/tests/test_yosys_netlist.py +2 -1
  82. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/tests/test_yosys_sdff.py +2 -2
  83. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/tests/test_yosys_sr.py +3 -5
  84. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/tests/test_yosys_synth.py +9 -7
  85. digsim-logic-simulator-0.3.0/pyproject.toml +0 -79
  86. digsim-logic-simulator-0.3.0/src/digsim_logic_simulator.egg-info/requires.txt +0 -5
  87. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/MANIFEST.in +0 -0
  88. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/setup.cfg +0 -0
  89. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/app/gui/_utils.py +0 -0
  90. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/app/gui_objects/images/AND.png +0 -0
  91. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/app/gui_objects/images/Analyzer.png +0 -0
  92. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/app/gui_objects/images/BUF.png +0 -0
  93. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/app/gui_objects/images/Buzzer.png +0 -0
  94. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/app/gui_objects/images/Clock.png +0 -0
  95. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/app/gui_objects/images/DFF.png +0 -0
  96. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/app/gui_objects/images/DIP_SWITCH.png +0 -0
  97. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/app/gui_objects/images/FlipFlop.png +0 -0
  98. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/app/gui_objects/images/IC.png +0 -0
  99. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/app/gui_objects/images/LED_OFF.png +0 -0
  100. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/app/gui_objects/images/LED_ON.png +0 -0
  101. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/app/gui_objects/images/MUX.png +0 -0
  102. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/app/gui_objects/images/NAND.png +0 -0
  103. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/app/gui_objects/images/NOR.png +0 -0
  104. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/app/gui_objects/images/NOT.png +0 -0
  105. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/app/gui_objects/images/ONE.png +0 -0
  106. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/app/gui_objects/images/OR.png +0 -0
  107. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/app/gui_objects/images/PB.png +0 -0
  108. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/app/gui_objects/images/Switch_OFF.png +0 -0
  109. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/app/gui_objects/images/Switch_ON.png +0 -0
  110. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/app/gui_objects/images/XNOR.png +0 -0
  111. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/app/gui_objects/images/XOR.png +0 -0
  112. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/app/gui_objects/images/YOSYS.png +0 -0
  113. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/app/gui_objects/images/ZERO.png +0 -0
  114. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/app/images/app_icon.png +0 -0
  115. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/app/model/_model_new_wire.py +0 -0
  116. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/circuit/components/_flip_flops.py +0 -0
  117. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/circuit/components/_mem64kbyte.py +0 -0
  118. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/circuit/components/_memstdout.py +0 -0
  119. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/circuit/components/atoms/_digsim_exception.py +0 -0
  120. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/circuit/components/ic/74162.json +0 -0
  121. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim/circuit/components/ic/7448.json +0 -0
  122. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim_logic_simulator.egg-info/dependency_links.txt +0 -0
  123. {digsim-logic-simulator-0.3.0 → digsim_logic_simulator-0.7.0}/src/digsim_logic_simulator.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  The Clear BSD License
2
2
 
3
- Copyright (c) 2023, Fredrik Andersson
3
+ Copyright (c) 2023-2024, Fredrik Andersson
4
4
  All rights reserved.
5
5
 
6
6
  Redistribution and use in source and binary forms, with or without
@@ -1,12 +1,12 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: digsim-logic-simulator
3
- Version: 0.3.0
3
+ Version: 0.7.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
7
  License: The Clear BSD License
8
8
 
9
- Copyright (c) 2023, Fredrik Andersson
9
+ Copyright (c) 2023-2024, Fredrik Andersson
10
10
  All rights reserved.
11
11
 
12
12
  Redistribution and use in source and binary forms, with or without
@@ -41,20 +41,22 @@ Project-URL: homepage, https://github.com/freand76/digsim
41
41
  Keywords: educational,simulation,digital
42
42
  Classifier: Development Status :: 5 - Production/Stable
43
43
  Classifier: Programming Language :: Python :: 3
44
- Classifier: Programming Language :: Python :: 3.8
45
44
  Classifier: Programming Language :: Python :: 3.9
46
45
  Classifier: Programming Language :: Python :: 3.10
47
46
  Classifier: Programming Language :: Python :: 3.11
48
47
  Classifier: Programming Language :: Python :: 3.12
48
+ Classifier: Programming Language :: Python :: 3.13
49
49
  Classifier: Programming Language :: Python :: 3 :: Only
50
- Requires-Python: >=3.8
50
+ Requires-Python: >=3.9
51
51
  Description-Content-Type: text/markdown
52
52
  License-File: LICENSE.md
53
- Requires-Dist: pyvcd>=0.3.0
54
- Requires-Dist: pyside6>=6.6.0
55
- Requires-Dist: pexpect==4.8.0
56
- Requires-Dist: qtawesome
57
- Requires-Dist: yowasp-yosys==0.36.0.8.post620
53
+ Requires-Dist: pyvcd>=0.4.1
54
+ Requires-Dist: pyside6>=6.9.0
55
+ Requires-Dist: pexpect==4.9.0
56
+ Requires-Dist: pydantic==2.11.4
57
+ Requires-Dist: qtawesome==1.4.0
58
+ Requires-Dist: yowasp-yosys==0.53.0.0.post912
59
+ Dynamic: license-file
58
60
 
59
61
  # DigSim - Interactive Digital Logic Simulator
60
62
 
@@ -135,6 +137,11 @@ Then the following package must be installed:
135
137
  > gtkwave sr.vcd
136
138
  ```
137
139
 
140
+ ### Examples of writing pytest/python test benches for synthesized verilog code
141
+ ```
142
+ > pytest examples/pytest_tb
143
+ ```
144
+
138
145
  ## Yosys synthesis helper tool
139
146
 
140
147
  ```
@@ -77,6 +77,11 @@ Then the following package must be installed:
77
77
  > gtkwave sr.vcd
78
78
  ```
79
79
 
80
+ ### Examples of writing pytest/python test benches for synthesized verilog code
81
+ ```
82
+ > pytest examples/pytest_tb
83
+ ```
84
+
80
85
  ## Yosys synthesis helper tool
81
86
 
82
87
  ```
@@ -0,0 +1,83 @@
1
+ [build-system]
2
+ requires = ["setuptools>=61.0.0"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "digsim-logic-simulator"
7
+ description = "Interactive Digital Logic Simulator"
8
+ version = "0.7.0"
9
+ authors = [{name = "Fredrik Andersson", email = "freand@gmail.com"}]
10
+ maintainers = [{name = "Fredrik Andersson", email = "freand@gmail.com"}]
11
+ readme = "README.md"
12
+ license = { file = "LICENSE.md" }
13
+ urls = { homepage = "https://github.com/freand76/digsim" }
14
+
15
+ classifiers = [
16
+ "Development Status :: 5 - Production/Stable",
17
+ "Programming Language :: Python :: 3",
18
+ "Programming Language :: Python :: 3.9",
19
+ "Programming Language :: Python :: 3.10",
20
+ "Programming Language :: Python :: 3.11",
21
+ "Programming Language :: Python :: 3.12",
22
+ "Programming Language :: Python :: 3.13",
23
+ "Programming Language :: Python :: 3 :: Only",
24
+ ]
25
+
26
+ requires-python = ">=3.9"
27
+ dependencies = [
28
+ "pyvcd>=0.4.1",
29
+ "pyside6>=6.9.0",
30
+ "pexpect==4.9.0",
31
+ "pydantic==2.11.4",
32
+ "qtawesome==1.4.0",
33
+ "yowasp-yosys==0.53.0.0.post912",
34
+ ]
35
+
36
+ keywords = ["educational", "simulation", "digital"]
37
+
38
+ [tool.ruff]
39
+ line-length = 99
40
+ target-version = "py39"
41
+
42
+ show-fixes = true
43
+ output-format = "full"
44
+
45
+ src = ["src"]
46
+ namespace-packages = ["src/digsim"]
47
+
48
+ [tool.ruff.lint]
49
+ # "extend" here adds to the ruff defaults, rather than replacing.
50
+ # Q = flake8-quotes, TID = flake8-tidy-imports, I = isort, FA = flake8-future-annotations
51
+ extend-select = ["Q", "TID", "I", "FA"]
52
+ # E501 = "line too long". Handled by black.
53
+ extend-ignore = ["E501"]
54
+
55
+ [tool.ruff.lint.per-file-ignores]
56
+ "__init__.py" = ["F401"]
57
+
58
+ [tool.ruff.lint.flake8-tidy-imports]
59
+ ban-relative-imports = "parents"
60
+
61
+ [tool.ruff.lint.isort]
62
+ lines-after-imports = 2
63
+
64
+ known-third-party = [
65
+ "pexpect",
66
+ "pytest",
67
+ "pyvcd",
68
+ "qtawesome",
69
+ "yowasp-yosys",
70
+ ]
71
+ section-order = [
72
+ "future",
73
+ "standard-library",
74
+ "third-party",
75
+ "PySide6",
76
+ "pyqtgraph",
77
+ "first-party",
78
+ "local-folder",
79
+ ]
80
+
81
+ [tool.ruff.lint.isort.sections]
82
+ "PySide6" = ["PySide6"]
83
+ "pyqtgraph" = ["pyqtgraph"]
@@ -1,6 +1,6 @@
1
1
  # Copyright (c) Fredrik Andersson, 2023
2
2
  # All rights reserved
3
3
 
4
- """ All classes within digsim namespace """
4
+ """All classes within digsim namespace"""
5
5
 
6
6
  from .circuit import Circuit # noqa: F401
@@ -1,7 +1,7 @@
1
1
  # Copyright (c) Fredrik Andersson, 2023
2
2
  # All rights reserved
3
3
 
4
- """ The main class module of the digsim.app namespace """
4
+ """The main class module of the digsim.app namespace"""
5
5
 
6
6
  import argparse
7
7
  import sys
@@ -1,6 +1,6 @@
1
1
  # Copyright (c) Fredrik Andersson, 2023
2
2
  # All rights reserved
3
3
 
4
- """ All classes within digsim.app.gui namespace """
4
+ """All classes within digsim.app.gui namespace"""
5
5
 
6
6
  from ._main_window import MainWindow # noqa: F401
@@ -1,12 +1,8 @@
1
- # Copyright (c) Fredrik Andersson, 2023
1
+ # Copyright (c) Fredrik Andersson, 2023-2024
2
2
  # All rights reserved
3
3
 
4
4
  """The circuit area and component widget"""
5
5
 
6
- # pylint: disable=unused-argument
7
- # pylint: disable=useless-parent-delegation
8
- # pylint: disable=too-few-public-methods
9
-
10
6
  from functools import partial
11
7
 
12
8
  from PySide6.QtCore import QPoint, QPointF, QRect, QRectF, Qt, QTimer
@@ -23,7 +19,6 @@ from digsim.app.settings import ComponentSettingsDialog
23
19
 
24
20
 
25
21
  class WirePartGraphicsItem(QGraphicsRectItem):
26
-
27
22
  """A part of a wire graphcis item"""
28
23
 
29
24
  CLOSE_TO_WIRE_MARGIN = 10
@@ -1,10 +1,8 @@
1
- # Copyright (c) Fredrik Andersson, 2023
1
+ # Copyright (c) Fredrik Andersson, 2023-2024
2
2
  # All rights reserved
3
3
 
4
4
  """Module for the component selection classes"""
5
5
 
6
- # pylint: disable=too-few-public-methods
7
-
8
6
  from functools import partial
9
7
 
10
8
  from PySide6.QtCore import QMimeData, QSize, Qt, QTimer
@@ -1,10 +1,8 @@
1
- # Copyright (c) Fredrik Andersson, 2023
1
+ # Copyright (c) Fredrik Andersson, 2023-2024
2
2
  # All rights reserved
3
3
 
4
4
  """The main window and widgets of the digsim gui application"""
5
5
 
6
- # pylint: disable=too-few-public-methods
7
-
8
6
  from PySide6.QtCore import Qt
9
7
  from PySide6.QtGui import QKeySequence, QShortcut
10
8
  from PySide6.QtWidgets import (
@@ -1,11 +1,8 @@
1
- # Copyright (c) Fredrik Andersson, 2023
1
+ # Copyright (c) Fredrik Andersson, 2023-2024
2
2
  # All rights reserved
3
3
 
4
4
  """The top bar of the main window/gui application"""
5
5
 
6
- # pylint: disable=too-few-public-methods
7
- # pylint: disable=too-many-instance-attributes
8
-
9
6
  from pathlib import Path
10
7
 
11
8
  import qtawesome as qta
@@ -262,7 +259,7 @@ class LoadSaveWidget(QFrame):
262
259
  self._redo_button.setToolTip("Redo")
263
260
  self.layout().addWidget(self._redo_button)
264
261
  self._settings_button = QPushButton("", self)
265
- self._settings_button.setIcon(qta.icon("fa.cog"))
262
+ self._settings_button.setIcon(qta.icon("mdi.cog"))
266
263
  self._settings_button.clicked.connect(self._settings_dialog)
267
264
  self._settings_button.setToolTip("Settings")
268
265
  self.layout().addWidget(self._settings_button)
@@ -1,10 +1,8 @@
1
- # Copyright (c) Fredrik Andersson, 2023
1
+ # Copyright (c) Fredrik Andersson, 2023-2024
2
2
  # All rights reserved
3
3
 
4
4
  """A warning dialog"""
5
5
 
6
- # pylint: disable=too-few-public-methods
7
-
8
6
  from PySide6.QtCore import QSize, Qt
9
7
  from PySide6.QtWidgets import (
10
8
  QDialog,
@@ -1,7 +1,7 @@
1
1
  # Copyright (c) Fredrik Andersson, 2023
2
2
  # All rights reserved
3
3
 
4
- """ All classes within digsim.app.gui_object namespace """
4
+ """All classes within digsim.app.gui_object namespace"""
5
5
 
6
6
  from ._component_object import ComponentObject # noqa: F401
7
7
  from ._gui_object_factory import get_class_by_name as class_factory # noqa: F401
@@ -1,7 +1,7 @@
1
- # Copyright (c) Fredrik Andersson, 2023
1
+ # Copyright (c) Fredrik Andersson, 2023-2024
2
2
  # All rights reserved
3
3
 
4
- """ A hexdigit component placed in the GUI """
4
+ """A hexdigit component placed in the GUI"""
5
5
 
6
6
  from PySide6.QtCore import QPoint, QSize, Qt
7
7
  from PySide6.QtGui import QPen
@@ -9,9 +9,6 @@ from PySide6.QtGui import QPen
9
9
  from ._component_object import ComponentObject
10
10
 
11
11
 
12
- # pylint: disable=too-many-arguments
13
-
14
-
15
12
  class BusBitsObject(ComponentObject):
16
13
  """The class for a bus/bit component placed in the GUI"""
17
14
 
@@ -1,7 +1,7 @@
1
1
  # Copyright (c) Fredrik Andersson, 2023
2
2
  # All rights reserved
3
3
 
4
- """ A buzzer component object """
4
+ """A buzzer component object"""
5
5
 
6
6
  from math import pi, sin
7
7
  from struct import pack
@@ -1,7 +1,7 @@
1
1
  # Copyright (c) Fredrik Andersson, 2023
2
2
  # All rights reserved
3
3
 
4
- """ A component context menu """
4
+ """A component context menu"""
5
5
 
6
6
  from PySide6.QtGui import QAction
7
7
  from PySide6.QtWidgets import QMenu
@@ -58,7 +58,7 @@ class ComponentContextMenu(QMenu):
58
58
  return self._menu_action.text() if self._menu_action is not None else ""
59
59
 
60
60
  def _delete(self):
61
- self._component_object.select(True)
61
+ self._component_object.setSelected(True)
62
62
  self._app_model.objects.delete_selected()
63
63
 
64
64
  def _raise(self):
@@ -1,12 +1,7 @@
1
- # Copyright (c) Fredrik Andersson, 2023
1
+ # Copyright (c) Fredrik Andersson, 2023-2024
2
2
  # All rights reserved
3
3
 
4
- """ A component placed in the GUI """
5
-
6
- # pylint: disable=unused-argument
7
- # pylint: disable=too-many-public-methods
8
- # pylint: disable=too-many-instance-attributes
9
- # pylint: disable=too-many-arguments
4
+ """A component placed in the GUI"""
10
5
 
11
6
  import abc
12
7
 
@@ -14,6 +9,8 @@ from PySide6.QtCore import QPoint, QRect, QSize, Qt
14
9
  from PySide6.QtGui import QFont, QFontMetrics, QPen
15
10
  from PySide6.QtWidgets import QGraphicsItem, QGraphicsRectItem
16
11
 
12
+ from digsim.storage_model import GuiPositionDataClass
13
+
17
14
  from ._component_context_menu import ComponentContextMenu
18
15
  from ._component_port_item import PortGraphicsItem
19
16
 
@@ -154,7 +151,7 @@ class ComponentObject(QGraphicsRectItem):
154
151
  if port.width == 1:
155
152
  self._port_dict[port]["name"] = port.name()
156
153
  else:
157
- 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]"
158
155
  item = PortGraphicsItem(self._app_model, self, port)
159
156
  self._port_dict[port]["item"] = item
160
157
  self.update_ports()
@@ -370,6 +367,7 @@ class ComponentObject(QGraphicsRectItem):
370
367
  """Set zlevel"""
371
368
  self.setZValue(level)
372
369
 
373
- def to_dict(self):
374
- """Return position as dict"""
375
- return {"x": int(self._save_pos.x()), "y": int(self._save_pos.y()), "z": self.zlevel}
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
+ )
@@ -1,7 +1,7 @@
1
1
  # Copyright (c) Fredrik Andersson, 2023
2
2
  # All rights reserved
3
3
 
4
- """ A component port graphics item """
4
+ """A component port graphics item"""
5
5
 
6
6
  from PySide6.QtCore import QRect, Qt
7
7
  from PySide6.QtGui import QBrush, QPen
@@ -1,7 +1,7 @@
1
- # Copyright (c) Fredrik Andersson, 2023
1
+ # Copyright (c) Fredrik Andersson, 2023-2024
2
2
  # All rights reserved
3
3
 
4
- """ A hexdigit component placed in the GUI """
4
+ """A hexdigit component placed in the GUI"""
5
5
 
6
6
  from PySide6.QtCore import QPoint, QRect, Qt
7
7
  from PySide6.QtGui import QFont, QPen
@@ -9,9 +9,6 @@ from PySide6.QtGui import QFont, QPen
9
9
  from ._image_objects import ImageObject
10
10
 
11
11
 
12
- # pylint: disable=too-many-arguments
13
-
14
-
15
12
  class DipSwitchObject(ImageObject):
16
13
  """The class for a bus/bit component placed in the GUI"""
17
14
 
@@ -1,7 +1,7 @@
1
1
  # Copyright (c) Fredrik Andersson, 2023
2
2
  # All rights reserved
3
3
 
4
- """ A GUI note object """
4
+ """A GUI note object"""
5
5
 
6
6
  from PySide6.QtCore import QPoint, QRect, Qt
7
7
  from PySide6.QtGui import QFont, QFontMetrics, QPen
@@ -1,7 +1,7 @@
1
1
  # Copyright (c) Fredrik Andersson, 2023
2
2
  # All rights reserved
3
3
 
4
- """ A GUI component object factory module """
4
+ """A GUI component object factory module"""
5
5
 
6
6
  from digsim.circuit.components.atoms import DigsimException
7
7
 
@@ -1,7 +1,7 @@
1
1
  # Copyright (c) Fredrik Andersson, 2023
2
2
  # All rights reserved
3
3
 
4
- """ A hexdigit component placed in the GUI """
4
+ """A hexdigit component placed in the GUI"""
5
5
 
6
6
  from ._component_object import ComponentObject
7
7
  from ._seven_segment_object import SevenSegmentObject
@@ -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 = (
@@ -1,9 +1,7 @@
1
- # Copyright (c) Fredrik Andersson, 2023
1
+ # Copyright (c) Fredrik Andersson, 2023-2024
2
2
  # All rights reserved
3
3
 
4
- """ A component with an image as symbol the GUI """
5
-
6
- # pylint: disable=too-many-arguments
4
+ """A component with an image as symbol the GUI"""
7
5
 
8
6
  from pathlib import Path
9
7
 
@@ -1,7 +1,7 @@
1
1
  # Copyright (c) Fredrik Andersson, 2023
2
2
  # All rights reserved
3
3
 
4
- """ A label component placed in the GUI """
4
+ """A label component placed in the GUI"""
5
5
 
6
6
  from PySide6.QtCore import QPoint, QRect, Qt
7
7
  from PySide6.QtGui import QPen, QPolygon
@@ -1,7 +1,7 @@
1
1
  # Copyright (c) Fredrik Andersson, 2023
2
2
  # All rights reserved
3
3
 
4
- """ A Logic Analyzer component placed in the GUI """
4
+ """A Logic Analyzer component placed in the GUI"""
5
5
 
6
6
  from PySide6.QtCore import QPoint, QRect, Qt
7
7
  from PySide6.QtGui import QPainterPath, QPen
@@ -23,7 +23,6 @@ class LogicAnalyzerObject(ImageObject):
23
23
  self.update_ports()
24
24
 
25
25
  def paint_component(self, painter):
26
-
27
26
  self.paint_component_base(painter)
28
27
  painter.setBrush(Qt.SolidPattern)
29
28
  painter.setBrush(Qt.black)
@@ -1,9 +1,7 @@
1
- # Copyright (c) Fredrik Andersson, 2023
1
+ # Copyright (c) Fredrik Andersson, 2023-2024
2
2
  # All rights reserved
3
3
 
4
- """ A 7-segment component placed in the GUI """
5
-
6
- # pylint: disable=too-many-arguments
4
+ """A 7-segment component placed in the GUI"""
7
5
 
8
6
  from PySide6.QtCore import QPoint, Qt
9
7
  from PySide6.QtGui import QPainterPath
@@ -1,9 +1,7 @@
1
- # Copyright (c) Fredrik Andersson, 2023
1
+ # Copyright (c) Fredrik Andersson, 2023-2024
2
2
  # All rights reserved
3
3
 
4
- """ A button component with an image as symbol the GUI """
5
-
6
- # pylint: disable=too-few-public-methods
4
+ """A button component with an image as symbol the GUI"""
7
5
 
8
6
  from functools import partial
9
7
 
@@ -1,7 +1,7 @@
1
1
  # Copyright (c) Fredrik Andersson, 2023
2
2
  # All rights reserved
3
3
 
4
- """ A yosys component with an image as symbol the GUI """
4
+ """A yosys component with an image as symbol the GUI"""
5
5
 
6
6
  from PySide6.QtGui import QAction
7
7
 
@@ -1,6 +1,6 @@
1
1
  # Copyright (c) Fredrik Andersson, 2023
2
2
  # All rights reserved
3
3
 
4
- """ All classes within digsim.app.model namespace """
4
+ """All classes within digsim.app.model namespace"""
5
5
 
6
6
  from ._model import AppModel # noqa: F401
@@ -1,11 +1,8 @@
1
- # Copyright (c) Fredrik Andersson, 2023
1
+ # Copyright (c) Fredrik Andersson, 2023-2024
2
2
  # All rights reserved
3
3
 
4
- """ An application model for a GUI simulated circuit """
4
+ """An application model for a GUI simulated circuit"""
5
5
 
6
- # pylint: disable=too-many-instance-attributes
7
-
8
- import json
9
6
  import queue
10
7
  import time
11
8
  from pathlib import Path
@@ -14,6 +11,7 @@ from PySide6.QtCore import QThread, Signal
14
11
 
15
12
  from digsim.app.gui_objects import ComponentObject
16
13
  from digsim.circuit.components.atoms import Component
14
+ from digsim.storage_model import AppFileDataClass
17
15
 
18
16
  from ._model_objects import ModelObjects
19
17
  from ._model_settings import ModelSettings
@@ -157,28 +155,27 @@ class AppModel(QThread):
157
155
  def save_circuit(self, path):
158
156
  """Save the circuit with GUI information"""
159
157
  circuit_folder = str(Path(path).parent)
160
- circuit_dict = self.objects.circuit_to_dict(circuit_folder)
161
- shortcuts_dict = self.shortcuts.to_dict()
162
- circuit_dict.update(shortcuts_dict)
163
- settings_dict = self.settings.to_dict()
164
- circuit_dict.update(settings_dict)
165
- json_object = json.dumps(circuit_dict, indent=4)
166
- with open(path, mode="w", encoding="utf-8") as json_file:
167
- json_file.write(json_object)
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)
168
166
  self._changed = False
169
167
  self.sig_control_notify.emit()
170
168
 
171
169
  def load_circuit(self, path):
172
170
  """Load a circuit with GUI information"""
173
171
  self._model_clear()
174
- with open(path, mode="r", encoding="utf-8") as json_file:
175
- circuit_dict = json.load(json_file)
172
+ app_file_dc = AppFileDataClass.load(path)
176
173
  circuit_folder = str(Path(path).parent)
177
174
  if len(circuit_folder) == 0:
178
175
  circuit_folder = "."
179
- exception_str_list = self.objects.dict_to_circuit(circuit_dict, circuit_folder)
180
- self.shortcuts.from_dict(circuit_dict)
181
- self.settings.from_dict(circuit_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)
182
179
  self.model_init()
183
180
  self._changed = False
184
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 create_from_dict(self, circuit_dict):
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
- gui_dict = circuit_dict.get("gui", {})
156
- component_dict = gui_dict.get(comp.name(), {})
157
- x = component_dict.get("x", 100)
158
- y = component_dict.get("y", 100)
159
- z = component_dict.get("z", 0)
160
- component_object = self._add_object(comp, x, y)
161
- component_object.zlevel = z
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
- model_components_dict["gui"][comp.name()] = comp_object.to_dict()
168
- return model_components_dict
164
+ gui_dict[comp.name()] = comp_object.to_gui_dataclass()
165
+ return gui_dict