digsim-logic-simulator 0.7.0__py3-none-any.whl → 0.9.0__py3-none-any.whl
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/app/gui/_circuit_area.py +2 -2
- digsim/app/gui_objects/_image_objects.py +4 -2
- digsim/circuit/_circuit.py +60 -41
- digsim/circuit/_waves_writer.py +19 -8
- digsim/circuit/components/_label_wire.py +3 -3
- digsim/circuit/components/_yosys_component.py +57 -46
- digsim/circuit/components/atoms/__init__.py +2 -1
- digsim/circuit/components/atoms/_component.py +40 -37
- digsim/circuit/components/atoms/_port.py +70 -65
- digsim/circuit/components/ic/74162.json +88 -86
- digsim/circuit/components/ic/7448.json +75 -73
- digsim/utils/__init__.py +1 -1
- digsim/utils/_yosys_netlist.py +87 -234
- {digsim_logic_simulator-0.7.0.dist-info → digsim_logic_simulator-0.9.0.dist-info}/METADATA +5 -38
- {digsim_logic_simulator-0.7.0.dist-info → digsim_logic_simulator-0.9.0.dist-info}/RECORD +18 -18
- {digsim_logic_simulator-0.7.0.dist-info → digsim_logic_simulator-0.9.0.dist-info}/WHEEL +1 -1
- {digsim_logic_simulator-0.7.0.dist-info → digsim_logic_simulator-0.9.0.dist-info}/licenses/LICENSE.md +0 -0
- {digsim_logic_simulator-0.7.0.dist-info → digsim_logic_simulator-0.9.0.dist-info}/top_level.txt +0 -0
digsim/utils/_yosys_netlist.py
CHANGED
|
@@ -5,266 +5,119 @@
|
|
|
5
5
|
Module with classes to parse a yosys netlist
|
|
6
6
|
"""
|
|
7
7
|
|
|
8
|
+
from __future__ import annotations
|
|
8
9
|
|
|
9
|
-
|
|
10
|
-
"""A class describing a port within a netlist"""
|
|
10
|
+
from typing import Any, Optional, Union
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
self._name = name
|
|
15
|
-
self._is_source = is_source
|
|
16
|
-
self._sinks = []
|
|
17
|
-
if net is None:
|
|
18
|
-
self._nets = []
|
|
19
|
-
else:
|
|
20
|
-
self._nets = [net]
|
|
12
|
+
from pydantic import Field
|
|
13
|
+
from pydantic.dataclasses import dataclass
|
|
21
14
|
|
|
22
|
-
def name(self):
|
|
23
|
-
"""Return port name"""
|
|
24
|
-
return self._name
|
|
25
15
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
16
|
+
@dataclass
|
|
17
|
+
class NetPort:
|
|
18
|
+
parent: Union[YosysModule, YosysCell]
|
|
19
|
+
parent_name: str
|
|
20
|
+
name: str
|
|
21
|
+
bit_index: Optional[int] = None
|
|
29
22
|
|
|
30
|
-
def is_source(self):
|
|
31
|
-
"""Return true if port is a source (false for sink)"""
|
|
32
|
-
return self._is_source
|
|
33
23
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
24
|
+
@dataclass
|
|
25
|
+
class Nets:
|
|
26
|
+
source: dict[int, NetPort] = Field(default_factory=dict)
|
|
27
|
+
sinks: dict[int, list[NetPort]] = Field(default_factory=dict)
|
|
37
28
|
|
|
38
|
-
def get_sinks(self):
|
|
39
|
-
"""Get source port sinks"""
|
|
40
|
-
return self._sinks
|
|
41
29
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
def from_module_dict(self, port_dict, global_nets):
|
|
47
|
-
"""Create xternal port from module dict"""
|
|
48
|
-
self._is_source = port_dict["direction"] == "input"
|
|
49
|
-
for net in port_dict["bits"]:
|
|
50
|
-
if net not in global_nets:
|
|
51
|
-
global_nets.append(net)
|
|
52
|
-
self._nets.append(net)
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
class _NetlistBlock:
|
|
56
|
-
"""Common base class for modules and cells"""
|
|
57
|
-
|
|
58
|
-
def __init__(self, name, block_type=None):
|
|
59
|
-
self._name = name
|
|
60
|
-
self._ports = {}
|
|
61
|
-
self._nets = []
|
|
62
|
-
self._block_type = block_type
|
|
63
|
-
self._net_to_source_port = {}
|
|
64
|
-
self._net_to_sink_ports = {}
|
|
65
|
-
|
|
66
|
-
def name(self):
|
|
67
|
-
"""Return name of block (cell or module)"""
|
|
68
|
-
return self._name
|
|
69
|
-
|
|
70
|
-
def get_type(self):
|
|
71
|
-
"""Get type"""
|
|
72
|
-
return self._block_type
|
|
73
|
-
|
|
74
|
-
def set_type(self, block_type):
|
|
75
|
-
"""Set type"""
|
|
76
|
-
self._block_type = block_type
|
|
77
|
-
|
|
78
|
-
def add_port(self, name, port):
|
|
79
|
-
"""Add port to block (cell or module)"""
|
|
80
|
-
self._ports[name] = port
|
|
81
|
-
nets = port.get_nets()
|
|
82
|
-
if port.is_source():
|
|
83
|
-
for net in nets:
|
|
84
|
-
self._net_to_source_port[net] = port
|
|
85
|
-
else:
|
|
86
|
-
for net in nets:
|
|
87
|
-
if net not in self._net_to_sink_ports:
|
|
88
|
-
self._net_to_sink_ports[net] = []
|
|
89
|
-
if port not in self._net_to_sink_ports[net]:
|
|
90
|
-
self._net_to_sink_ports[net].append(port)
|
|
91
|
-
|
|
92
|
-
def get_nets(self):
|
|
93
|
-
"""Get nets of block (cell or module)"""
|
|
94
|
-
return self._nets
|
|
95
|
-
|
|
96
|
-
def get_source_ports(self):
|
|
97
|
-
"""Get source ports of block (cell or module)"""
|
|
98
|
-
ports = []
|
|
99
|
-
for _, port in self._net_to_source_port.items():
|
|
100
|
-
ports.append(port)
|
|
101
|
-
return ports
|
|
102
|
-
|
|
103
|
-
def get_source_port(self, net):
|
|
104
|
-
"""Get source port of block (cell or module)"""
|
|
105
|
-
return self._net_to_source_port.get(net)
|
|
106
|
-
|
|
107
|
-
def get_sink_ports(self, net):
|
|
108
|
-
"""Get sink port of block (cell or module)"""
|
|
109
|
-
return self._net_to_sink_ports.get(net, [])
|
|
30
|
+
@dataclass
|
|
31
|
+
class YosysPort:
|
|
32
|
+
direction: str
|
|
33
|
+
bits: list[Union[int, str]]
|
|
110
34
|
|
|
35
|
+
@property
|
|
36
|
+
def is_output(self):
|
|
37
|
+
return self.direction == "output"
|
|
111
38
|
|
|
112
|
-
|
|
113
|
-
|
|
39
|
+
def is_same(self, compare_port):
|
|
40
|
+
return (compare_port.direction == self.direction) and (
|
|
41
|
+
len(compare_port.bits) == len(self.bits)
|
|
42
|
+
)
|
|
114
43
|
|
|
115
|
-
def __init__(self, name):
|
|
116
|
-
super().__init__(name)
|
|
117
44
|
|
|
118
|
-
|
|
45
|
+
@dataclass
|
|
46
|
+
class YosysCell:
|
|
47
|
+
type: str
|
|
48
|
+
port_directions: dict[str, str] = Field(default_factory=dict)
|
|
49
|
+
connections: dict[str, list[Union[str, int]]] = Field(default_factory=dict)
|
|
50
|
+
hide_name: int = 0
|
|
51
|
+
parameters: dict[str, Any] = Field(default_factory=dict)
|
|
52
|
+
attributes: dict[str, Any] = Field(default_factory=dict)
|
|
53
|
+
|
|
54
|
+
def get_nets(self, name, nets):
|
|
55
|
+
for port_name, net_list in self.connections.items():
|
|
56
|
+
net = net_list[0]
|
|
57
|
+
port = NetPort(parent=self, parent_name=name, name=port_name)
|
|
58
|
+
if self.port_directions[port_name] == "input":
|
|
59
|
+
if net not in nets.sinks:
|
|
60
|
+
nets.sinks[net] = []
|
|
61
|
+
nets.sinks[net].append(port)
|
|
62
|
+
else:
|
|
63
|
+
nets.source[net] = port
|
|
64
|
+
|
|
65
|
+
def component_name(self, name):
|
|
119
66
|
"""Return a friendly name for a netlist cell"""
|
|
120
|
-
return f"{
|
|
67
|
+
return f"{name.split('$')[-1]}_{self.component_type()}"
|
|
121
68
|
|
|
122
|
-
def
|
|
69
|
+
def component_type(self):
|
|
123
70
|
"""Return a friendly type for a netlist cell"""
|
|
124
|
-
return f"_{self.
|
|
125
|
-
|
|
126
|
-
def from_dict(self, cell_dict, global_nets):
|
|
127
|
-
"""Create netlist cell from dict"""
|
|
128
|
-
self.set_type(cell_dict["type"])
|
|
129
|
-
for port_name, port_dir in cell_dict["port_directions"].items():
|
|
130
|
-
output = port_dir == "output"
|
|
131
|
-
port_net = cell_dict["connections"][port_name]
|
|
132
|
-
self._nets.extend(port_net)
|
|
133
|
-
for net in port_net:
|
|
134
|
-
if net not in global_nets:
|
|
135
|
-
global_nets.append(net)
|
|
136
|
-
port = _NetlistPort(self, port_name, net, output)
|
|
137
|
-
self.add_port(port_name, port)
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
class _NestlistModule(_NetlistBlock):
|
|
141
|
-
"""A class holding a module in a yosys netlist"""
|
|
142
|
-
|
|
143
|
-
def __init__(self, name):
|
|
144
|
-
super().__init__(name, "module")
|
|
145
|
-
self._cells = {}
|
|
146
|
-
self._module_nets = []
|
|
147
|
-
self._ext_if = {}
|
|
148
|
-
|
|
149
|
-
static_cell = _NetlistCell("StaticLevel")
|
|
150
|
-
static_cell.from_dict(
|
|
151
|
-
{
|
|
152
|
-
"type": "$_StaticLevel_",
|
|
153
|
-
"port_directions": {"L": "output", "H": "output"},
|
|
154
|
-
"connections": {"L": ["0"], "H": ["1"]},
|
|
155
|
-
},
|
|
156
|
-
self._nets,
|
|
157
|
-
)
|
|
158
|
-
self._cells["StaticLevel"] = static_cell
|
|
71
|
+
return f"_{self.type[2:-1]}_"
|
|
159
72
|
|
|
160
|
-
def from_dict(self, module_dict):
|
|
161
|
-
"""Create module from dict"""
|
|
162
|
-
for ext_port_name, port_dict in module_dict["ports"].items():
|
|
163
|
-
ext_port = _NetlistPort(self, ext_port_name)
|
|
164
|
-
ext_port.from_module_dict(port_dict, self._nets)
|
|
165
|
-
nets = ext_port.get_nets()
|
|
166
|
-
ext_port_dict = {"output": ext_port.is_source(), "nets": nets}
|
|
167
|
-
self._ext_if[ext_port_name] = ext_port_dict
|
|
168
|
-
self.add_port(ext_port_name, ext_port)
|
|
169
73
|
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
74
|
+
@dataclass
|
|
75
|
+
class YosysNetName:
|
|
76
|
+
bits: list[int]
|
|
77
|
+
attributes: dict[str, Any] = Field(default_factory=dict)
|
|
78
|
+
hide_name: int = 0
|
|
174
79
|
|
|
175
|
-
def get_cells(self):
|
|
176
|
-
"""Get cells dict"""
|
|
177
|
-
return self._cells
|
|
178
80
|
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
81
|
+
@dataclass
|
|
82
|
+
class YosysModule:
|
|
83
|
+
attributes: dict[str, Any] = Field(default_factory=dict)
|
|
84
|
+
parameter_default_values: dict[str, Any] = Field(default_factory=dict)
|
|
85
|
+
ports: dict[str, YosysPort] = Field(default_factory=dict)
|
|
86
|
+
cells: dict[str, YosysCell] = Field(default_factory=dict)
|
|
87
|
+
netnames: dict[str, YosysNetName] = Field(default_factory=dict)
|
|
182
88
|
|
|
183
|
-
def
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
return cell_port
|
|
192
|
-
return None
|
|
89
|
+
def is_same_interface(self, netlist):
|
|
90
|
+
is_same = True
|
|
91
|
+
for netlist_port_name, netlist_port in netlist.ports.items():
|
|
92
|
+
module_port = self.ports.get(netlist_port_name)
|
|
93
|
+
if module_port is None or not module_port.is_same(netlist_port):
|
|
94
|
+
is_same = False
|
|
95
|
+
break
|
|
96
|
+
return is_same
|
|
193
97
|
|
|
194
|
-
def
|
|
195
|
-
|
|
196
|
-
sink_ports = self.get_sink_ports(net)
|
|
197
|
-
for _, cell in self._cells.items():
|
|
198
|
-
cell_sink_ports = cell.get_sink_ports(net)
|
|
199
|
-
for port in cell_sink_ports:
|
|
200
|
-
if port not in sink_ports:
|
|
201
|
-
sink_ports.append(port)
|
|
202
|
-
return sink_ports
|
|
203
|
-
|
|
204
|
-
def connect(self):
|
|
205
|
-
"""Connect all nets within module"""
|
|
206
|
-
_source_port_dict = {}
|
|
207
|
-
_sink_ports_dict = {}
|
|
208
|
-
_cells_dict = {}
|
|
209
|
-
|
|
210
|
-
# Build net to cell dict
|
|
211
|
-
for _, cell in self._cells.items():
|
|
212
|
-
for cell_net in cell.get_nets():
|
|
213
|
-
if cell_net not in _cells_dict:
|
|
214
|
-
_cells_dict[cell_net] = []
|
|
215
|
-
_cells_dict[cell_net].append(cell)
|
|
216
|
-
|
|
217
|
-
# Build net to ports dict
|
|
218
|
-
for net in self._nets:
|
|
219
|
-
# Module
|
|
220
|
-
port = self.get_source_port(net)
|
|
221
|
-
if port is not None:
|
|
222
|
-
_source_port_dict[net] = port
|
|
223
|
-
sink_ports = self.get_sink_ports(net)
|
|
224
|
-
# Cells
|
|
225
|
-
for cell in _cells_dict.get(net, []):
|
|
226
|
-
port = cell.get_source_port(net)
|
|
227
|
-
if port is not None:
|
|
228
|
-
_source_port_dict[net] = port
|
|
229
|
-
cell_sink_ports = cell.get_sink_ports(net)
|
|
230
|
-
sink_ports.extend(cell_sink_ports)
|
|
231
|
-
_sink_ports_dict[net] = sink_ports
|
|
98
|
+
def get_nets(self):
|
|
99
|
+
nets = Nets()
|
|
232
100
|
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
101
|
+
for port_name, port_item in self.ports.items():
|
|
102
|
+
for bit_index, net in enumerate(port_item.bits):
|
|
103
|
+
port = NetPort(parent=self, parent_name="top", name=port_name, bit_index=bit_index)
|
|
104
|
+
if port_item.is_output:
|
|
105
|
+
if net not in nets.sinks:
|
|
106
|
+
nets.sinks[net] = []
|
|
107
|
+
nets.sinks[net].append(port)
|
|
108
|
+
else:
|
|
109
|
+
nets.source[net] = port
|
|
238
110
|
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
nets = module_net.get_nets()
|
|
242
|
-
ports = []
|
|
243
|
-
for net in nets:
|
|
244
|
-
port = _source_port_dict[net]
|
|
245
|
-
ports.append(port)
|
|
246
|
-
module_net.set_ports(ports)
|
|
111
|
+
for cell_name, cell in self.cells.items():
|
|
112
|
+
cell.get_nets(cell_name, nets)
|
|
247
113
|
|
|
248
|
-
|
|
249
|
-
"""Get the nets for this module"""
|
|
250
|
-
return self._module_nets
|
|
114
|
+
return nets
|
|
251
115
|
|
|
252
116
|
|
|
117
|
+
@dataclass
|
|
253
118
|
class YosysNetlist:
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
def __init__(self):
|
|
257
|
-
self._modules = {}
|
|
119
|
+
creator: Optional[str] = None
|
|
120
|
+
modules: dict[str, YosysModule] = Field(default_factory=dict)
|
|
258
121
|
|
|
259
122
|
def get_modules(self):
|
|
260
|
-
|
|
261
|
-
return self._modules
|
|
262
|
-
|
|
263
|
-
def from_dict(self, netlist_dict):
|
|
264
|
-
"""Parse netlist from dict"""
|
|
265
|
-
for module_name, module_dict in netlist_dict["modules"].items():
|
|
266
|
-
module = _NestlistModule(module_name)
|
|
267
|
-
module.from_dict(module_dict)
|
|
268
|
-
self._modules[module_name] = module
|
|
269
|
-
for _, module in self._modules.items():
|
|
270
|
-
module.connect()
|
|
123
|
+
return self.modules
|
|
@@ -1,42 +1,9 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: digsim-logic-simulator
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.9.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-2024, 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
|
|
@@ -50,12 +17,12 @@ Classifier: Programming Language :: Python :: 3 :: Only
|
|
|
50
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
|
|
20
|
+
Requires-Dist: pyvcd==0.4.1
|
|
21
|
+
Requires-Dist: pyside6==6.9.1
|
|
55
22
|
Requires-Dist: pexpect==4.9.0
|
|
56
|
-
Requires-Dist: pydantic==2.11.
|
|
23
|
+
Requires-Dist: pydantic==2.11.7
|
|
57
24
|
Requires-Dist: qtawesome==1.4.0
|
|
58
|
-
Requires-Dist: yowasp-yosys==0.
|
|
25
|
+
Requires-Dist: yowasp-yosys==0.57.0.0.post986
|
|
59
26
|
Dynamic: license-file
|
|
60
27
|
|
|
61
28
|
# DigSim - Interactive Digital Logic Simulator
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
digsim/__init__.py,sha256=UB-i1HtNR6rIX4_SClZp-lM4njGa7_1sbMvd14NuyAs,149
|
|
2
2
|
digsim/app/__main__.py,sha256=iECz0kvEQ0R4fGzH6KAOxyDfoyvwrRLo7JmT0jMx39s,1368
|
|
3
3
|
digsim/app/gui/__init__.py,sha256=-HnN8a-AcDcovbCHf1a_R-sQtW2_tQXnPJ3izyKLOjw,165
|
|
4
|
-
digsim/app/gui/_circuit_area.py,sha256=
|
|
4
|
+
digsim/app/gui/_circuit_area.py,sha256=rbqP957eVAuYBvtg5anybOrvnGc6TSe9dB_0rRsHSDI,16366
|
|
5
5
|
digsim/app/gui/_component_selection.py,sha256=C-TeBruf8sGdEnGATtLm6jTesIqf-0AnKRBRLrtL_18,6388
|
|
6
6
|
digsim/app/gui/_main_window.py,sha256=X0AIh3m1ySaldgYr3MHddRSqVkNdWl_qNJOIdnv2mNA,5275
|
|
7
7
|
digsim/app/gui/_top_bar.py,sha256=HWGiWTKjYz3yRJ4K1tbMyVxhTC-Y6LEiREr6nHMAhKE,13067
|
|
@@ -17,7 +17,7 @@ digsim/app/gui_objects/_dip_switch_object.py,sha256=6SmqoyF3MuUphLJA4tlyff4JXJBx
|
|
|
17
17
|
digsim/app/gui_objects/_gui_note_object.py,sha256=sMakGjdR0truGBzaR2GaFZZoDg99v76Bs5DD6ea3cjA,2604
|
|
18
18
|
digsim/app/gui_objects/_gui_object_factory.py,sha256=wfe0M4ZNSd5mK_0fi6ZhzHddFxkm_t4tku3OZir2VzU,2465
|
|
19
19
|
digsim/app/gui_objects/_hexdigit_object.py,sha256=cCxxpcSRLXRFNLIfrY_AUBGOSVIjRjO3HAuOv7wXGkI,1930
|
|
20
|
-
digsim/app/gui_objects/_image_objects.py,sha256=
|
|
20
|
+
digsim/app/gui_objects/_image_objects.py,sha256=hOFgkpp0Ar0btncVXp7Jors7hXQQENc1FqzJGS1m_G0,7613
|
|
21
21
|
digsim/app/gui_objects/_label_object.py,sha256=6CnISeYEmmef28T6yBYJ1z-a_3nTtyl4p-EU-pEzVK0,3570
|
|
22
22
|
digsim/app/gui_objects/_logic_analyzer_object.py,sha256=B3WpFrTu9LDF0S_ol0VVS4vOIDqw_e08wmEX7fBjD98,2671
|
|
23
23
|
digsim/app/gui_objects/_seven_segment_object.py,sha256=EaNRxmM_IA-JkLHVVHXwSCd8jV9JAXTmdXMuXOidio4,4227
|
|
@@ -60,8 +60,8 @@ digsim/app/settings/_component_settings.py,sha256=88D9OuEcFIlaqZozomWHSYrl7opz4j
|
|
|
60
60
|
digsim/app/settings/_gui_settings.py,sha256=sDi2POUsHvS7_4SO5qsTu_nN48HsTN4UfGPzdmECs9w,2764
|
|
61
61
|
digsim/app/settings/_shortcut_dialog.py,sha256=JTm7aawG2ar_DvWhBT8ZzgWsq9gLEJ6pJ_-eHUMPh-c,1524
|
|
62
62
|
digsim/circuit/__init__.py,sha256=yGyhcdnlcpht_hyR2az_A4c7-bO_NkT2lBIDFvtI010,216
|
|
63
|
-
digsim/circuit/_circuit.py,sha256=
|
|
64
|
-
digsim/circuit/_waves_writer.py,sha256=
|
|
63
|
+
digsim/circuit/_circuit.py,sha256=r_QFKhB13p9hLbrKUN0RtR1o2sqc-UNemdiz-La8cGY,10956
|
|
64
|
+
digsim/circuit/_waves_writer.py,sha256=ZedBa2TbWuq-zDc1MQyANmQOMDGGzNMSh4nKPuqXCkA,2092
|
|
65
65
|
digsim/circuit/components/__init__.py,sha256=j-xNFbXJ15rSJLhDg7E-SlKvxn6Uy7Zl42YDUkZBFZo,1267
|
|
66
66
|
digsim/circuit/components/_bus_bits.py,sha256=mHWkwAHtkEq88pOEQ0b5ndFZvum794j7kUkTAWHUCdc,1916
|
|
67
67
|
digsim/circuit/components/_button.py,sha256=Q8drjQ2kNFCfgK-7UzlmNHP47bOpGa9_t16pDtjhL4s,1028
|
|
@@ -72,7 +72,7 @@ digsim/circuit/components/_flip_flops.py,sha256=eOB1hpSfK7vlpcOQzHqILpAzfwsqQPob
|
|
|
72
72
|
digsim/circuit/components/_gates.py,sha256=K_aFT4GTo4JF_zoaNYiCRZfZEx4vEibMHZSCDImfPHQ,7167
|
|
73
73
|
digsim/circuit/components/_hexdigit.py,sha256=MQlmEnQkQnuH6rGc-FB68mOctjVY8QyAR5FCOHYNCns,2259
|
|
74
74
|
digsim/circuit/components/_ic.py,sha256=Rs8Z_PuhKo3peK9pwdbvlGNK8_w6evSdXYNdrjWB3-8,917
|
|
75
|
-
digsim/circuit/components/_label_wire.py,sha256=
|
|
75
|
+
digsim/circuit/components/_label_wire.py,sha256=wAAvq-o1ygsX5br6O9KvsPtQyU5C2FdMRUJP_WWlXSw,5164
|
|
76
76
|
digsim/circuit/components/_led.py,sha256=hR_iclDWZua8duNy9BQcTBuhKkIh3g5ahpfkHQ1LYSA,452
|
|
77
77
|
digsim/circuit/components/_logic_analyzer.py,sha256=K6sUfN23lUfQ5GHQFrxvR8fgfWKLy29Cj0K7dZzW_cE,1809
|
|
78
78
|
digsim/circuit/components/_mem64kbyte.py,sha256=tqex3qFxa7jk841f87inNB4UIY9E5z1SleqAL82eCUY,1482
|
|
@@ -83,23 +83,23 @@ digsim/circuit/components/_seven_segment.py,sha256=UxxjGLuIirVB2Px09XlL8_zjgE7F8
|
|
|
83
83
|
digsim/circuit/components/_static_level.py,sha256=2Assm1cmAfryVZ3KTQ1uGY8Q6eRrBipdwLITewXfIHg,677
|
|
84
84
|
digsim/circuit/components/_static_value.py,sha256=vfRPS_F9mKOXpHJxzs0JQKXqcj0o6d-090zbyZaECA4,1236
|
|
85
85
|
digsim/circuit/components/_yosys_atoms.py,sha256=NeH8XjjpoACHBfQRqR5RJxWorZhSjGk0t73cJOviSZw,37599
|
|
86
|
-
digsim/circuit/components/_yosys_component.py,sha256=
|
|
87
|
-
digsim/circuit/components/atoms/__init__.py,sha256=
|
|
88
|
-
digsim/circuit/components/atoms/_component.py,sha256=
|
|
86
|
+
digsim/circuit/components/_yosys_component.py,sha256=LkYneNSvzQMn61RzlHk3aSkl9tF6JjibknfwmLeWCFk,8792
|
|
87
|
+
digsim/circuit/components/atoms/__init__.py,sha256=NU45pfJcSrdwZA-SVQeORlaznl_0BciY4VN3vVSnD8o,498
|
|
88
|
+
digsim/circuit/components/atoms/_component.py,sha256=DpMS1yOWWgk11Y9ae0PfuOJdlJsrzgrzuYrgsN62dbQ,8815
|
|
89
89
|
digsim/circuit/components/atoms/_digsim_exception.py,sha256=Y5mBve15zZbduqNNAyf7WzqDk4NtvUL_g2vYy5kBQ3U,173
|
|
90
|
-
digsim/circuit/components/atoms/_port.py,sha256=
|
|
91
|
-
digsim/circuit/components/ic/74162.json,sha256=
|
|
92
|
-
digsim/circuit/components/ic/7448.json,sha256=
|
|
90
|
+
digsim/circuit/components/atoms/_port.py,sha256=yT1TqmKPVlw8G_0r_6dErcqIkXCqB8z0pE5oL6Bnxzo,12596
|
|
91
|
+
digsim/circuit/components/ic/74162.json,sha256=RAeSva6TVuwfKHsvU9HC-ZVfRVrCkIsQUz_jcANT_fE,26693
|
|
92
|
+
digsim/circuit/components/ic/7448.json,sha256=hKMXhPqW-JBTF6rdz9u5HC_hY9cBRpJtMkLP7uOQXIo,21185
|
|
93
93
|
digsim/storage_model/__init__.py,sha256=lubmO9_BCUtEahyW1yE7f3aGHngEevGIwf_0LeOB7Y8,289
|
|
94
94
|
digsim/storage_model/_app.py,sha256=Aer9s_mUBKSydsyeWYvVPHX2XF5ZGPuXq8z4PoXu8lA,1353
|
|
95
95
|
digsim/storage_model/_circuit.py,sha256=NnaHLwqb9gAhqAxeZ1RkHHvoS_YJwixlz0xs-zmIrQU,3596
|
|
96
96
|
digsim/synth/__init__.py,sha256=jhBHLOHf-vNa94Zg5q5dGcf0fgQTModfjUKtmUSffiw,180
|
|
97
97
|
digsim/synth/__main__.py,sha256=wZWAzWsisoxA7hfqkKtu3H066uWyFajgPro2MEGlKbs,2173
|
|
98
98
|
digsim/synth/_synthesis.py,sha256=ug9vSeTyZrvRCboNLL7dDIFVpGqH_ibr5fhOZJHpqUs,4271
|
|
99
|
-
digsim/utils/__init__.py,sha256=
|
|
100
|
-
digsim/utils/_yosys_netlist.py,sha256=
|
|
101
|
-
digsim_logic_simulator-0.
|
|
102
|
-
digsim_logic_simulator-0.
|
|
103
|
-
digsim_logic_simulator-0.
|
|
104
|
-
digsim_logic_simulator-0.
|
|
105
|
-
digsim_logic_simulator-0.
|
|
99
|
+
digsim/utils/__init__.py,sha256=MT9TNcpa7fNAqtBsmCcceKMrUSU_v9xeJ6Nox_TL7Lo,191
|
|
100
|
+
digsim/utils/_yosys_netlist.py,sha256=TnEQc27NxPD96uGAF_wiijsZsX59vmDqzNP9rkMnLyc,3612
|
|
101
|
+
digsim_logic_simulator-0.9.0.dist-info/licenses/LICENSE.md,sha256=FrvohZfyfpH4xrvKdXiQ5hD7dUB7w4DcsRA3p-pOmLw,1693
|
|
102
|
+
digsim_logic_simulator-0.9.0.dist-info/METADATA,sha256=5NVelguEoPG3GlO78OlDNwfzX-NWC5Zqt1w8BD5yIVA,4557
|
|
103
|
+
digsim_logic_simulator-0.9.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
104
|
+
digsim_logic_simulator-0.9.0.dist-info/top_level.txt,sha256=qpCMzQKADZHVqZIoQgFrv3qJ3u7PPU73gTCXQglqLa8,7
|
|
105
|
+
digsim_logic_simulator-0.9.0.dist-info/RECORD,,
|
|
File without changes
|
{digsim_logic_simulator-0.7.0.dist-info → digsim_logic_simulator-0.9.0.dist-info}/top_level.txt
RENAMED
|
File without changes
|