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.
- nortl/__init__.py +85 -0
- nortl/components/__init__.py +8 -0
- nortl/components/channel.py +132 -0
- nortl/components/timer.py +73 -0
- nortl/core/__init__.py +40 -0
- nortl/core/checker.py +135 -0
- nortl/core/common/__init__.py +4 -0
- nortl/core/common/access.py +25 -0
- nortl/core/common/debug.py +6 -0
- nortl/core/common/naming_helper.py +33 -0
- nortl/core/constructs/__init__.py +13 -0
- nortl/core/constructs/condition.py +143 -0
- nortl/core/constructs/fork_join.py +84 -0
- nortl/core/constructs/loop.py +138 -0
- nortl/core/engine.py +575 -0
- nortl/core/exceptions.py +139 -0
- nortl/core/manager/__init__.py +6 -0
- nortl/core/manager/scratch_manager.py +128 -0
- nortl/core/manager/signal_manager.py +71 -0
- nortl/core/modifiers.py +136 -0
- nortl/core/module.py +181 -0
- nortl/core/operations.py +834 -0
- nortl/core/parameter.py +88 -0
- nortl/core/process.py +451 -0
- nortl/core/protocols.py +628 -0
- nortl/core/renderers/__init__.py +0 -0
- nortl/core/renderers/operations/__init__.py +34 -0
- nortl/core/renderers/operations/arithmetics.py +38 -0
- nortl/core/renderers/operations/base.py +111 -0
- nortl/core/renderers/operations/comparison.py +44 -0
- nortl/core/renderers/operations/logic.py +38 -0
- nortl/core/renderers/operations/misc.py +26 -0
- nortl/core/renderers/operations/slice.py +30 -0
- nortl/core/signal.py +878 -0
- nortl/core/state.py +201 -0
- nortl/py.typed +0 -0
- nortl/renderer/__init__.py +5 -0
- nortl/renderer/mermaid_renderer.py +38 -0
- nortl/renderer/networkx_renderer.py +29 -0
- nortl/renderer/verilog_renderer.py +325 -0
- nortl/renderer/verilog_utils/__init__.py +6 -0
- nortl/renderer/verilog_utils/formatter.py +29 -0
- nortl/renderer/verilog_utils/process.py +226 -0
- nortl/renderer/verilog_utils/structural.py +146 -0
- nortl/renderer/verilog_utils/utils.py +23 -0
- nortl/utils/__init__.py +0 -0
- nortl/utils/parse_utils.py +37 -0
- nortl/utils/templates/testbench.sv +41 -0
- nortl/utils/test_wrapper.py +218 -0
- nortl/utils/type_aliases.py +15 -0
- nortl/verilog_library/__init__.py +74 -0
- nortl/verilog_library/nortl_clock_gate.sv +20 -0
- nortl/verilog_library/nortl_count_down_timer.sv +50 -0
- nortl/verilog_library/nortl_delay.sv +66 -0
- nortl/verilog_library/nortl_edge_detector.sv +34 -0
- nortl/verilog_library/nortl_sync.sv +28 -0
- nortl-1.4.0.dist-info/METADATA +105 -0
- nortl-1.4.0.dist-info/RECORD +60 -0
- nortl-1.4.0.dist-info/WHEEL +4 -0
- 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,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.
|