nortl 1.4.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.
Files changed (60) hide show
  1. nortl/__init__.py +85 -0
  2. nortl/components/__init__.py +8 -0
  3. nortl/components/channel.py +132 -0
  4. nortl/components/timer.py +73 -0
  5. nortl/core/__init__.py +40 -0
  6. nortl/core/checker.py +135 -0
  7. nortl/core/common/__init__.py +4 -0
  8. nortl/core/common/access.py +25 -0
  9. nortl/core/common/debug.py +6 -0
  10. nortl/core/common/naming_helper.py +33 -0
  11. nortl/core/constructs/__init__.py +13 -0
  12. nortl/core/constructs/condition.py +143 -0
  13. nortl/core/constructs/fork_join.py +84 -0
  14. nortl/core/constructs/loop.py +138 -0
  15. nortl/core/engine.py +575 -0
  16. nortl/core/exceptions.py +139 -0
  17. nortl/core/manager/__init__.py +6 -0
  18. nortl/core/manager/scratch_manager.py +128 -0
  19. nortl/core/manager/signal_manager.py +71 -0
  20. nortl/core/modifiers.py +136 -0
  21. nortl/core/module.py +181 -0
  22. nortl/core/operations.py +834 -0
  23. nortl/core/parameter.py +88 -0
  24. nortl/core/process.py +451 -0
  25. nortl/core/protocols.py +628 -0
  26. nortl/core/renderers/__init__.py +0 -0
  27. nortl/core/renderers/operations/__init__.py +34 -0
  28. nortl/core/renderers/operations/arithmetics.py +38 -0
  29. nortl/core/renderers/operations/base.py +111 -0
  30. nortl/core/renderers/operations/comparison.py +44 -0
  31. nortl/core/renderers/operations/logic.py +38 -0
  32. nortl/core/renderers/operations/misc.py +26 -0
  33. nortl/core/renderers/operations/slice.py +30 -0
  34. nortl/core/signal.py +878 -0
  35. nortl/core/state.py +201 -0
  36. nortl/py.typed +0 -0
  37. nortl/renderer/__init__.py +5 -0
  38. nortl/renderer/mermaid_renderer.py +38 -0
  39. nortl/renderer/networkx_renderer.py +29 -0
  40. nortl/renderer/verilog_renderer.py +325 -0
  41. nortl/renderer/verilog_utils/__init__.py +6 -0
  42. nortl/renderer/verilog_utils/formatter.py +29 -0
  43. nortl/renderer/verilog_utils/process.py +226 -0
  44. nortl/renderer/verilog_utils/structural.py +146 -0
  45. nortl/renderer/verilog_utils/utils.py +23 -0
  46. nortl/utils/__init__.py +0 -0
  47. nortl/utils/parse_utils.py +37 -0
  48. nortl/utils/templates/testbench.sv +41 -0
  49. nortl/utils/test_wrapper.py +218 -0
  50. nortl/utils/type_aliases.py +15 -0
  51. nortl/verilog_library/__init__.py +74 -0
  52. nortl/verilog_library/nortl_clock_gate.sv +20 -0
  53. nortl/verilog_library/nortl_count_down_timer.sv +50 -0
  54. nortl/verilog_library/nortl_delay.sv +66 -0
  55. nortl/verilog_library/nortl_edge_detector.sv +34 -0
  56. nortl/verilog_library/nortl_sync.sv +28 -0
  57. nortl-1.4.0.dist-info/METADATA +105 -0
  58. nortl-1.4.0.dist-info/RECORD +60 -0
  59. nortl-1.4.0.dist-info/WHEEL +4 -0
  60. nortl-1.4.0.dist-info/licenses/LICENSE +11 -0
@@ -0,0 +1,15 @@
1
+ """Provides type aliases for common types."""
2
+
3
+ from typing import TYPE_CHECKING, Optional
4
+
5
+ from typing_extensions import TypeAlias
6
+
7
+ __all__ = [
8
+ 'IntSlice',
9
+ ]
10
+
11
+ # slice became generic in 2024, but is somewhat broken (still includes Any?))
12
+ if TYPE_CHECKING:
13
+ IntSlice: TypeAlias = slice[Optional[int], Optional[int], Optional[int]]
14
+ else:
15
+ IntSlice = slice # type: ignore[misc]
@@ -0,0 +1,74 @@
1
+ from pathlib import Path
2
+ from typing import List
3
+
4
+ from nortl.core.module import Module
5
+
6
+ VERILOG_LIBRARY_DIR = Path(__file__).parent
7
+
8
+ BUILT_IN_LIB = {
9
+ 'nortl_sync': (VERILOG_LIBRARY_DIR / 'nortl_sync.sv').resolve(),
10
+ 'nortl_edge_detector': (VERILOG_LIBRARY_DIR / 'nortl_edge_detector.sv').resolve(),
11
+ 'nortl_delay': (VERILOG_LIBRARY_DIR / 'nortl_delay.sv').resolve(),
12
+ 'nortl_count_down_timer': (VERILOG_LIBRARY_DIR / 'nortl_count_down_timer.sv').resolve(),
13
+ 'nortl_clock_gate': (VERILOG_LIBRARY_DIR / 'nortl_clock_gate.sv').resolve(),
14
+ }
15
+
16
+
17
+ def get_modules() -> List[Module]:
18
+ module_list = []
19
+
20
+ hdl_sync = ''
21
+ with open(BUILT_IN_LIB['nortl_sync'], 'r') as file:
22
+ hdl_sync = file.read()
23
+
24
+ sync = Module('nortl_sync', hdl_sync)
25
+ sync.add_port('IN')
26
+ sync.add_port('OUT')
27
+ sync.add_parameter('DATA_WIDTH', 1)
28
+ sync.add_port('CLK_REQ')
29
+ sync.set_clk_request('CLK_REQ')
30
+ module_list.append(sync)
31
+
32
+ hdl_edge_detect = ''
33
+ with open(BUILT_IN_LIB['nortl_edge_detector'], 'r') as file:
34
+ hdl_edge_detect = file.read()
35
+
36
+ edge_detect = Module('nortl_edge_detector', hdl_edge_detect)
37
+ edge_detect.add_port('SIGNAL')
38
+ edge_detect.add_port('RISING')
39
+ edge_detect.add_port('FALLING')
40
+ edge_detect.add_port('CLK_REQ')
41
+ edge_detect.set_clk_request('CLK_REQ')
42
+ module_list.append(edge_detect)
43
+
44
+ hdl_delay = ''
45
+ with open(BUILT_IN_LIB['nortl_delay'], 'r') as file:
46
+ hdl_delay = file.read()
47
+
48
+ delay = Module('nortl_delay', hdl_delay)
49
+ delay.add_port('IN')
50
+ delay.add_port('OUT')
51
+ delay.add_parameter('DATA_WIDTH', 1)
52
+ delay.add_parameter('DELAY_STEPS', 1)
53
+ delay.add_port('CLK_REQ')
54
+ delay.set_clk_request('CLK_REQ')
55
+ module_list.append(delay)
56
+
57
+ hdl_timer = ''
58
+ with open(BUILT_IN_LIB['nortl_count_down_timer'], 'r') as file:
59
+ hdl_timer = file.read()
60
+
61
+ timer = Module('nortl_count_down_timer', hdl_timer)
62
+ timer.add_port('RELOAD')
63
+ timer.add_port('ZERO')
64
+ timer.add_port('DELAY')
65
+ timer.add_parameter('DATA_WIDTH', 1)
66
+ module_list.append(timer)
67
+
68
+ cg = ''
69
+ with open(BUILT_IN_LIB['nortl_clock_gate'], 'r') as file:
70
+ cg = file.read()
71
+ # Ports are not defined here -- should not be used directly!
72
+ module_list.append(Module('nortl_clock_gate', cg))
73
+
74
+ return module_list
@@ -0,0 +1,20 @@
1
+ module nortl_clock_gate (
2
+ input logic CLK_I,
3
+ input logic EN,
4
+ output logic GCLK_O
5
+ );
6
+
7
+ logic enable_latch;
8
+
9
+ always_latch begin
10
+ if (~CLK_I)
11
+ begin
12
+ enable_latch = EN;
13
+ end
14
+ end
15
+
16
+ always_comb begin
17
+ GCLK_O = enable_latch & CLK_I;
18
+ end
19
+
20
+ endmodule
@@ -0,0 +1,50 @@
1
+ module nortl_count_down_timer #(
2
+ parameter DATA_WIDTH = 16
3
+ ) (
4
+ input logic CLK_I,
5
+ input logic RST_ASYNC_I,
6
+
7
+ input logic RELOAD,
8
+ input logic [DATA_WIDTH-1:0] DELAY,
9
+ output logic ZERO
10
+ );
11
+
12
+ logic [DATA_WIDTH-1:0] counter;
13
+ logic RELOAD_DLY;
14
+
15
+ always_ff @(posedge CLK_I or posedge RST_ASYNC_I)
16
+ begin
17
+ if (RST_ASYNC_I)
18
+ begin
19
+ counter <= 0;
20
+ RELOAD_DLY <= 0;
21
+ end
22
+ else begin
23
+ RELOAD_DLY <= RELOAD;
24
+ if (RELOAD)
25
+ begin
26
+ if (DELAY > 2)
27
+ begin
28
+ counter <= DELAY - 2;
29
+ end
30
+ end
31
+ else if (counter != 0) begin
32
+ counter <= counter - 1;
33
+ end
34
+ end
35
+ end
36
+
37
+ always_comb begin
38
+ ZERO = (counter == 0) & ~RELOAD;
39
+
40
+ if (DELAY == 1)
41
+ begin
42
+ ZERO = ~RELOAD;
43
+ end
44
+ if (DELAY == 0)
45
+ begin
46
+ ZERO = ~RELOAD;
47
+ end
48
+ end
49
+
50
+ endmodule
@@ -0,0 +1,66 @@
1
+ module nortl_delay #(
2
+ parameter DATA_WIDTH = 1,
3
+ parameter DELAY_STEPS = 2
4
+ ) (
5
+ input logic CLK_I,
6
+ input logic RST_ASYNC_I,
7
+
8
+ input logic [DATA_WIDTH-1:0] IN,
9
+ output logic [DATA_WIDTH-1:0] OUT,
10
+
11
+ output logic CLK_REQ
12
+ );
13
+
14
+ logic [DATA_WIDTH-1:0] shiftreg [DELAY_STEPS-1:0];
15
+
16
+ always_ff @(posedge CLK_I or posedge RST_ASYNC_I) begin
17
+ if (RST_ASYNC_I)
18
+ begin
19
+ for (int i=DELAY_STEPS-1; i>=0; i=i-1)
20
+ begin
21
+ shiftreg[i] <= {DATA_WIDTH{1'b0}};
22
+ end
23
+ end
24
+ else begin
25
+ if (DELAY_STEPS == 1)
26
+ begin
27
+ shiftreg[0] <= IN;
28
+ end
29
+ else begin
30
+ for (int i=DELAY_STEPS-2; i>=0; i=i-1)
31
+ begin
32
+ shiftreg[i+1] <= shiftreg[i];
33
+ end
34
+ shiftreg[0] <= IN;
35
+ end
36
+ end
37
+ end
38
+
39
+ always_comb begin
40
+ if (DELAY_STEPS == 1)
41
+ begin
42
+ OUT = shiftreg[0];
43
+ end
44
+ else begin
45
+ OUT = shiftreg[DELAY_STEPS-1];
46
+ end
47
+ end
48
+
49
+ always_comb begin
50
+ CLK_REQ = 0;
51
+
52
+ if (DELAY_STEPS == 1)
53
+ begin
54
+ CLK_REQ = CLK_REQ | (shiftreg[0] != IN);
55
+ end
56
+ else begin
57
+ for (int i=DELAY_STEPS-2; i>=0; i=i-1)
58
+ begin
59
+ CLK_REQ = CLK_REQ | (shiftreg[i+1] != shiftreg[i]);
60
+ end
61
+ CLK_REQ = CLK_REQ | (shiftreg[0] != IN);
62
+ end
63
+ end
64
+
65
+
66
+ endmodule
@@ -0,0 +1,34 @@
1
+ module nortl_edge_detector(
2
+ input logic CLK_I,
3
+ input logic RST_ASYNC_I,
4
+
5
+ input logic SIGNAL,
6
+ output logic RISING,
7
+ output logic FALLING,
8
+
9
+ output logic CLK_REQ
10
+ );
11
+
12
+ logic [1:0] sr;
13
+
14
+ always_ff @(posedge CLK_I or posedge RST_ASYNC_I)
15
+ begin
16
+ if (RST_ASYNC_I)
17
+ begin
18
+ sr <= 2'b00;
19
+ end
20
+ else begin
21
+ sr <= {sr[0], SIGNAL};
22
+ end
23
+ end
24
+
25
+ always_comb begin
26
+ RISING = (sr == 2'b01);
27
+ FALLING = (sr == 2'b10);
28
+ end
29
+
30
+ always_comb begin
31
+ CLK_REQ = sr != {sr[0], SIGNAL};
32
+ end
33
+
34
+ endmodule
@@ -0,0 +1,28 @@
1
+ module nortl_sync #(
2
+ parameter DATA_WIDTH = 1
3
+ ) (
4
+ input logic CLK_I,
5
+ input logic RST_ASYNC_I,
6
+
7
+ input logic [DATA_WIDTH-1:0] IN,
8
+ output logic [DATA_WIDTH-1:0] OUT,
9
+
10
+ output logic CLK_REQ
11
+ );
12
+
13
+ always @(posedge CLK_I or posedge RST_ASYNC_I)
14
+ begin
15
+ if (RST_ASYNC_I)
16
+ begin
17
+ OUT <= {DATA_WIDTH{1'b0}};
18
+ end
19
+ else begin
20
+ OUT <= IN;
21
+ end
22
+ end
23
+
24
+ always_comb begin
25
+ CLK_REQ = OUT != IN;
26
+ end
27
+
28
+ endmodule
@@ -0,0 +1,105 @@
1
+ Metadata-Version: 2.4
2
+ Name: nortl
3
+ Version: 1.4.0
4
+ Summary: Not-only RTL.
5
+ Project-URL: Homepage, https://github.com/IMMS-Ilmenau/nortl
6
+ Project-URL: Documentation, https://IMMS-Ilmenau.github.io/nortl
7
+ Author-email: Florian Koegler <florian.koegler@imms.de>, Georg Glaeser <georg.glaeser@imms.de>
8
+ License-File: LICENSE
9
+ Requires-Python: >=3.12
10
+ Requires-Dist: more-itertools>=10.8.0
11
+ Requires-Dist: networkx>=3.4.2
12
+ Provides-Extra: type-stubs
13
+ Requires-Dist: pytest-stub; extra == 'type-stubs'
14
+ Requires-Dist: types-networkx; extra == 'type-stubs'
15
+ Description-Content-Type: text/markdown
16
+
17
+ # noRTL - Hardware design beyond register transfer level
18
+
19
+ **noRTL** (Not-only RTL) is a Python-based code generation framework for designing and implementing hardware description language (HDL) modules, particularly SystemVerilog state machines. It provides a high-level, Pythonic API for describing sets of finite state machines (FSMs) and hardware components with built-in correctness guarantees.
20
+
21
+ **noRTL** aims to make the design of complex digital systems easier by reducing the shortcommings of current hardware description languages that use the register transfer level (RTL) to model digital circuit's behavior. This tool goes beyond this level of abstraction: We digital designers want to describe behavior with cycle-level accuracy but do not want do deal with the complexity of state naming, state coding, starting parallel processes, etc. **noRTL** realizes this tedious part of digital design inside its core.
22
+
23
+ The code that is written for **noRTL** is pure Python code. The **noRTL** package realizes state handling and data structure assembly for you while the Python code is executed. **noRTL** can be understood as a fancy generator that assembles state machines and provides the tooling to render it to SystemVerilog and tools for verifying your code.
24
+
25
+ ## Main ideas
26
+
27
+ **noRTL** is built with the following concepts and ideas.
28
+
29
+ * Each hardware description is an executable Python program. The hardware structure is assembled during execution. There is no need for static code analysis or parsing.
30
+ * There should be no need to declare states explicitely. The number of states is determined during execution of the code.
31
+ * The behavior description should be easily readable and feel procedural. Control structures should work similar to Python equivalents.
32
+ * Checks and Optimizations are to be done during runtime of the Python code. Post-Optimization has not been necessary (yet).
33
+
34
+ ## Installation
35
+
36
+ A prerequisite for noRTL is the availablility of icarus Verilog in your path. This can be installed using your system's package manager or using the *oss-cad-suite* (https://github.com/YosysHQ/oss-cad-suite-build)
37
+
38
+ ### Method 1: Using pip (Public Registry)
39
+
40
+ ```bash
41
+ # Install nortl
42
+ pip install nortl
43
+ ```
44
+
45
+ ### Method 2: Using uv (Recommended)
46
+
47
+ ```bash
48
+ # Clone the repository
49
+ git clone https://github.com/IMMS-Ilmenau/nortl
50
+ cd nortl
51
+
52
+ # Install dependencies
53
+ uv sync
54
+
55
+ # Activate the virtual environment
56
+ source .venv/bin/activate # On Windows: .venv\Scripts\activate
57
+ ```
58
+
59
+ ### Method 3: Development Installation
60
+
61
+ For development work, install in editable mode:
62
+
63
+ ```bash
64
+ # Clone the repository
65
+ git clone https://github.com/IMMS-Ilmenau/nortl
66
+ cd nortl
67
+
68
+ # Install development dependencies
69
+ uv sync --all-extras
70
+
71
+ # Activate the virtual environment
72
+ source .venv/bin/activate
73
+ ```
74
+
75
+ ---
76
+
77
+ ## Your First State Machine
78
+
79
+ Let's create a simple state machine that toggles an output based on an input.
80
+
81
+ ```python
82
+ from nortl import Engine, Const
83
+
84
+ # Create an engine with a module name -- Clock and reset signal is automatically included
85
+ engine = Engine("my_first_engine")
86
+
87
+ # Define input and output signals
88
+ enable = engine.define_input("enable", width=1)
89
+ output = engine.define_output("output", width=1, reset_value=0)
90
+
91
+ # Don't define states -- define behavior!
92
+ with engine.while_loop(Const(1)):
93
+ engine.wait_for(enable == 1)
94
+ engine.set(output, 1)
95
+ engine.sync() # Wait one clock cycle
96
+ engine.set(output, 0)
97
+ engine.wait_for(enable == 0)
98
+
99
+ # Generate SystemVerilog code
100
+ from nortl.renderer import VerilogRenderer
101
+ renderer = VerilogRenderer()
102
+ verilog_code = renderer.render(engine)
103
+
104
+ print(verilog_code)
105
+ ```
@@ -0,0 +1,60 @@
1
+ nortl/__init__.py,sha256=yze_D9JqD0wGjlWrdqkvhevUwvmEoKcqI1kqCAo6lC8,2835
2
+ nortl/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
+ nortl/components/__init__.py,sha256=ITKiNMf25WF9MTxADQzj-oXpslyQuzOF_LBpyaOa1pg,135
4
+ nortl/components/channel.py,sha256=d06JkHTzXe_YkTt79TAZtCfUA-_oT8teCQlklGN5pPE,5350
5
+ nortl/components/timer.py,sha256=cRHukfEyj0rxcBz-6dElyQaQagEdKU1Pczx3OMcBbBo,3278
6
+ nortl/core/__init__.py,sha256=HLu5yLfVXQCxuC5fPpkbT36aRdxVo4cxPVBUUvBqycY,948
7
+ nortl/core/checker.py,sha256=DDDpELBOUYguuOxLCe22Xxa44eFg3NvkuvGQPwStF7Q,4720
8
+ nortl/core/engine.py,sha256=NllCCV0pOUyUNvR04FtHnXpC8ozdLS_YYDovzWQQasM,23085
9
+ nortl/core/exceptions.py,sha256=Q9TFYwoRBkLGujX8PAJw_UxpJ1UQDKLcCws2jt-eYpI,4670
10
+ nortl/core/modifiers.py,sha256=6T6FryfDkYjo3F-tCyZXdKIDR_1jM2zfQe2gg_Z0vP8,4912
11
+ nortl/core/module.py,sha256=Rp1MBEcsOfCVTjRXfdO8h_1yBFrGdCsvJ0KgEAwRtw8,6328
12
+ nortl/core/operations.py,sha256=_LxVNT5EPnNaSiWJ46H0wk-84-VcS0x63NDZV8Aj9Z0,29787
13
+ nortl/core/parameter.py,sha256=nsILizih4xP-D_z88cdAuhTIDgdj6alG8Wl2apSstgc,2444
14
+ nortl/core/process.py,sha256=dKGHx_6JvGfEciQsTeAADyOPi0u5X4nASmr1qF6Gy-8,16458
15
+ nortl/core/protocols.py,sha256=WmynKcQzGSzrW5q0oq94pYlLtiEYY_00Zbp3gFfW2oI,17325
16
+ nortl/core/signal.py,sha256=CywOXsXgJfzR1PTjzijFvCUpfPQ-IPTqzu8BZHgya_w,34632
17
+ nortl/core/state.py,sha256=wpdpG42KfnZKruSvPTj6SuJgI_8OCC2OkTMmpPWAs-U,8125
18
+ nortl/core/common/__init__.py,sha256=yNYywnKjrYGgflRDIWBH-aqCJcFjP9aL7AMEpIBy5D4,115
19
+ nortl/core/common/access.py,sha256=daDLTT_5dBiv1Jg5msnKOG8AVGA2CDHHRP5RgVubCOc,1198
20
+ nortl/core/common/debug.py,sha256=7Gx8BUdREL2ChVGqXzcyOSYGKv4eeeO_8-kVMTFOQEM,111
21
+ nortl/core/common/naming_helper.py,sha256=lk9zG30Q-HZc1FL358NmLqZjNSsPkMIgChn0Xkhv8O8,1084
22
+ nortl/core/constructs/__init__.py,sha256=zREQW_WUEEHeyZC_IamvT2tCAcWRZ6RQmRP9B3O7Shk,327
23
+ nortl/core/constructs/condition.py,sha256=lZtGPkKgho0KW2Q6maQyH2oKlQ0wdpQwq2nU5-5ndko,5045
24
+ nortl/core/constructs/fork_join.py,sha256=R5Aisa-LauAUYihC0I2CO3-MEA00ReuLJumZF6zE-iA,2793
25
+ nortl/core/constructs/loop.py,sha256=Y-z-nCcDb_dRVEL_vJqkisrd6ZD805L1mmNu2Gr7b8U,4870
26
+ nortl/core/manager/__init__.py,sha256=V6Y_KcuKWFGkNgDxv9WD7OSBhcV5Eyv_pJHCFdrTB_k,257
27
+ nortl/core/manager/scratch_manager.py,sha256=HJ1mR8I8uPvBhMmwYC66QQgpjSqKTdCkdSPBUUhlB2Q,4861
28
+ nortl/core/manager/signal_manager.py,sha256=I8C4BLHRUoygE8aSW4lpnhQ65jHLHaYhVCOXjq5BrfA,2634
29
+ nortl/core/renderers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
30
+ nortl/core/renderers/operations/__init__.py,sha256=DpZ5uc9p6OX8AG1wDf8nicrg6qQewdLd_vHWCbh2u9o,763
31
+ nortl/core/renderers/operations/arithmetics.py,sha256=33AvfoOLaYFR4ihTjY6zIpHngv0Vjz2h8fo8d12r5uM,950
32
+ nortl/core/renderers/operations/base.py,sha256=sToM0J5_8XoT4Lto6koq2vhSHOO6PwYv2UKbvuc5soA,2721
33
+ nortl/core/renderers/operations/comparison.py,sha256=4Q_-3PAAh3BT4GqJ2pUdpSVEe_UAZtEaAXK88XhIxf8,1109
34
+ nortl/core/renderers/operations/logic.py,sha256=FfX1QwJIvXfP83XH-GgAGDSdY9VfOUOY2zm1vKiJd_I,921
35
+ nortl/core/renderers/operations/misc.py,sha256=W8qJ4c_JcYHRTfecerr_CjU-6sRPERZU8Mg-Iwrt8NE,574
36
+ nortl/core/renderers/operations/slice.py,sha256=7GYMvVoPjIG-yi0S-JuG5Wvmtd_jPStf89X8cfd5tbw,918
37
+ nortl/renderer/__init__.py,sha256=YALyD3gAP7JqXTIVeQ7mWZSE_rHIXzbR5evoeW90IY0,210
38
+ nortl/renderer/mermaid_renderer.py,sha256=TnCbTCN022GjosyrBEzlbMqoAgZsNWvmdW3w97vcQeY,1173
39
+ nortl/renderer/networkx_renderer.py,sha256=vX68niQwai8W7xJSPArdE5ZTqZekQhTuSg29jsqsWhg,847
40
+ nortl/renderer/verilog_renderer.py,sha256=--886yfnhr6070NVPwaLVB-v20jb_ElCGhZr2CrI74M,13769
41
+ nortl/renderer/verilog_utils/__init__.py,sha256=1ew_fRobzwG7sp4mlJ3hKQibQS_pg2YBghraIOIUq3E,120
42
+ nortl/renderer/verilog_utils/formatter.py,sha256=1HIz_vsNZUcMVN9dXysiCdF8kugc8U-h2dTxG-YfLA0,988
43
+ nortl/renderer/verilog_utils/process.py,sha256=gec2oX2vlP6Iq3yb7unJIjXwuEZtd45fL-b6WV_vr60,6727
44
+ nortl/renderer/verilog_utils/structural.py,sha256=4ZkyCWYe_tIji3tOTwR8cp_4vCMjcJZHDyYEkE2Pf2I,4822
45
+ nortl/renderer/verilog_utils/utils.py,sha256=X1zBX4UE6T5kDM3IaeNx3nHjXvS9G-pIBpSbejfsuFA,741
46
+ nortl/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
47
+ nortl/utils/parse_utils.py,sha256=gaBXnzmHYye6sbK6omMBftw9-rvFEpvRu92CHJ0mi3Q,1066
48
+ nortl/utils/test_wrapper.py,sha256=SGmKE9wE1jRsaex9Wfu9BT2uljsL5_evSuw0kZZtDdM,7979
49
+ nortl/utils/type_aliases.py,sha256=r_wu1PAHUDJQVBp3d1rJC94xysPVAb8CD9RZqgD9RTg,385
50
+ nortl/utils/templates/testbench.sv,sha256=-tUitJOLl0TOnnLazCtBuiqTkCK97A_gztpUwY9cOkc,553
51
+ nortl/verilog_library/__init__.py,sha256=1Ir6iSWOPH3Jdh3Er3z0DKKaEjjPldABvX13tA6tCI0,2321
52
+ nortl/verilog_library/nortl_clock_gate.sv,sha256=7p2GWI6xoJrrVM6miHnaYFf-9sRDUNDndchpdxHV5vs,271
53
+ nortl/verilog_library/nortl_count_down_timer.sv,sha256=VKGYPU_YcrSaepScOJmRI6rWwzwT-oi27LFEfydBt0U,890
54
+ nortl/verilog_library/nortl_delay.sv,sha256=vJNuqmFMLrBYUplycS6_a-IXiYJ_C_yDvip0Ks8Cxjc,1331
55
+ nortl/verilog_library/nortl_edge_detector.sv,sha256=QFTZlVAHL8JpphQCDle3dosUVP_3G9QAfDuOMc-Zu9E,531
56
+ nortl/verilog_library/nortl_sync.sv,sha256=cv8vz4m8W23PVY3kK39HoyGcXfrK07o0IQrtoKAKwW4,448
57
+ nortl-1.4.0.dist-info/METADATA,sha256=Qp8lgEjjCATwy7gk7GdnXbqyjhVW4gT3uHI5NAvk-7E,4194
58
+ nortl-1.4.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
59
+ nortl-1.4.0.dist-info/licenses/LICENSE,sha256=DEUjAaM32obsGgeMfwy7XgeyO5Q5rEpSECUvSO_oRHs,1535
60
+ nortl-1.4.0.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.28.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,11 @@
1
+ Copyright 2026 Institut für Mikroelektronik- und Mechatronik-Systeme gemeinnützige GmbH (IMMS GmbH)
2
+
3
+ Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
4
+
5
+ 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
6
+
7
+ 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
8
+
9
+ 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
10
+
11
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.