logiklib 0.1.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.
logiklib/__init__.py ADDED
@@ -0,0 +1,8 @@
1
+ __version__ = "0.1.0"
2
+
3
+
4
+ def register_part_data(fpga, part_name, package_name):
5
+ fpga.register_source(
6
+ package_name,
7
+ f"github://siliconcompiler/logiklib/v{__version__}/{part_name}_cad.tar.gz",
8
+ f"v{__version__}")
@@ -0,0 +1,45 @@
1
+ # Copyright 2024 Zero ASIC Corporation
2
+
3
+ from logiklib import register_part_data
4
+
5
+ from siliconcompiler import FPGA
6
+
7
+
8
+ ####################################################
9
+ # Setup for K4_N8_6x6 FPGA
10
+ ####################################################
11
+ def setup():
12
+ part_name = 'K4_N8_6x6'
13
+
14
+ fpga = FPGA(part_name, package=f"logik-fpga-{part_name}")
15
+
16
+ register_part_data(fpga, part_name, f"logik-fpga-{part_name}")
17
+
18
+ fpga.set('fpga', part_name, 'vendor', 'zeroasic')
19
+
20
+ fpga.set('fpga', part_name, 'var', 'vpr_device_code', 'K4_N8_6x6')
21
+
22
+ fpga.set('fpga', part_name, 'lutsize', 4)
23
+
24
+ fpga.set('fpga', part_name, 'var', 'vpr_clock_model', 'ideal')
25
+
26
+ fpga.set('fpga', part_name, 'file', 'archfile', 'cad/K4_N8_6x6.xml')
27
+ fpga.set('fpga', part_name, 'file', 'graphfile', 'cad/K4_N8_6x6_rr_graph.xml')
28
+
29
+ for tool in ('vpr', 'yosys'):
30
+ fpga.set('fpga', part_name, 'var', f'{tool}_registers', 'dff')
31
+
32
+ fpga.set('fpga', part_name, 'file', 'bitstream_map', 'cad/K4_N8_6x6_bitstream_map.json')
33
+
34
+ fpga.set('fpga', part_name, 'file', 'constraints_map', 'cad/K4_N8_6x6_constraint_map.json')
35
+
36
+ fpga.set('fpga', part_name, 'var', 'channelwidth', 50)
37
+
38
+ return fpga
39
+
40
+
41
+ #########################
42
+ if __name__ == "__main__":
43
+ fpga = setup()
44
+ assert fpga.check_filepaths()
45
+ fpga.write_manifest(f'{fpga.design}.json')
@@ -0,0 +1,35 @@
1
+ # K4_N8_6x6 FPGA Virtual Architecture
2
+
3
+ The K4_N8_6x6 FPGA is a fixed-size virtual FPGA architecture consisting of configurable logic blocks (CLBs) and I/O blocks (IOBs).
4
+
5
+ A summary of K4_N8_6x6 resources is shown in the table below
6
+
7
+ Resource Type | Count
8
+ ---------------------|------
9
+ Lookup Tables (LUTs) | 288
10
+ Registers | 288
11
+ GPIOs | 192
12
+ Max Clock Domains | 1
13
+
14
+ K4_N8_6x6 logic resources are organized into an 8x8 array of components. A 6x6 array of CLBs is surrounded on the perimeter by four banks of IOBs, one per side of the array. Corner array locations are unused.
15
+
16
+ ## Logic Resources
17
+
18
+ A brief description for K4_N8_6x6 logic resources is shown below
19
+
20
+ ### Configurable Logic Block (CLB)
21
+
22
+ Each configurable logic block (CLB) consists of 8 4-input lookup-tables (LUTs). The LUTs in a CLB share common inputs through local routing called a crossbar. All LUT outputs are fed back to the crossbar so that they may be used as inputs within the CLB. Each LUT output can be paired with a flip-flop (register) to synchronize the LUT output to a common clock. Flip-flops not paired with a LUT can accept crossbar inputs directly. All flip-flop usage is automatically determined as part of the RTL-to-bitstream flow and is thus transparent to the user.
23
+
24
+ ### I/O Block (IOB)
25
+
26
+ General purpose I/O blocks (IOBs) are provided to provide a consistent signal interface between signals external to the FPGA and reconfigurable logic. Each IOB contains eight iopad primitives. Each iopad primitive can operate either in input mode or output mode. The IOB thus supports a maximum of eight user I/O signals in any combination of inputs and outputs.
27
+
28
+ ### Clocking
29
+
30
+ This architecture uses an ideal clock model; clocks are modeled as globally distributed to all logic resources with zero delay.
31
+
32
+ ## K4_N8_6x6 Configuration
33
+
34
+ K4_N8_6x6 bitstreams are generated using Logik. An 8-bit wide interface is used to load a generated bitstream.
35
+
@@ -0,0 +1,64 @@
1
+ # Copyright 2025 Zero ASIC Corporation
2
+
3
+ from logiklib import register_part_data
4
+
5
+ from siliconcompiler import FPGA
6
+
7
+
8
+ ####################################################
9
+ # Setup for K6_N8_12x12_BD FPGA
10
+ ####################################################
11
+ def setup():
12
+ part_name = 'K6_N8_12x12_BD'
13
+
14
+ fpga = FPGA(part_name, package=f"logik-fpga-{part_name}")
15
+
16
+ register_part_data(fpga, part_name, f"logik-fpga-{part_name}")
17
+
18
+ fpga.set('fpga', part_name, 'vendor', 'zeroasic')
19
+
20
+ fpga.set('fpga', part_name, 'var', 'vpr_device_code', part_name)
21
+
22
+ fpga.set('fpga', part_name, 'lutsize', 6)
23
+ fpga.set('fpga', part_name, 'var', 'feature_set', [
24
+ 'async_reset', 'async_set', 'enable'])
25
+
26
+ fpga.set('fpga', part_name, 'var', 'vpr_clock_model', 'ideal')
27
+
28
+ fpga.set('fpga', part_name, 'file', 'archfile', 'cad/K6_N8_12x12_BD.xml')
29
+ fpga.set('fpga', part_name, 'file', 'graphfile', 'cad/K6_N8_12x12_BD_rr_graph.xml')
30
+
31
+ for tool in ('vpr', 'yosys'):
32
+ fpga.set('fpga', part_name, 'var', f'{tool}_registers', [
33
+ 'dff', 'dffe', 'dffer', 'dffers', 'dffes', 'dffr', 'dffrs', 'dffs',
34
+ 'dsp_mult', 'bram_sp'
35
+ ])
36
+
37
+ fpga.set('fpga', part_name, 'file', 'yosys_flop_techmap', 'techlib/tech_flops.v')
38
+ fpga.set('fpga', part_name, 'file', 'yosys_memory_techmap', 'techlib/tech_bram.v')
39
+ fpga.set('fpga', part_name, 'file', 'yosys_memory_libmap', 'techlib/bram_memory_map.txt')
40
+ fpga.set('fpga', part_name, 'file', 'yosys_dsp_techmap', 'techlib/tech_dsp.v')
41
+
42
+ # Set the dsp options for the yosys built-in DSP correctly for this
43
+ # architecture
44
+ fpga.set('fpga', part_name, 'var', 'yosys_dsp_options', [
45
+ 'DSP_A_MAXWIDTH=18', 'DSP_A_MINWIDTH=2',
46
+ 'DSP_B_MAXWIDTH=18', 'DSP_B_MINWIDTH=2',
47
+ 'DSP_NAME=_dsp_block_'])
48
+
49
+ fpga.set('fpga', part_name, 'var', 'dsp_blackbox_options', 'BLACKBOX_MACROS')
50
+
51
+ fpga.set('fpga', part_name, 'file', 'bitstream_map', 'cad/K6_N8_12x12_BD_bitstream_map.json')
52
+
53
+ fpga.set('fpga', part_name, 'file', 'constraints_map', 'cad/K6_N8_12x12_BD_constraint_map.json')
54
+
55
+ fpga.set('fpga', part_name, 'var', 'channelwidth', 80)
56
+
57
+ return fpga
58
+
59
+
60
+ #########################
61
+ if __name__ == "__main__":
62
+ fpga = setup()
63
+ assert fpga.check_filepaths()
64
+ fpga.write_manifest(f'{fpga.design}.json')
@@ -0,0 +1,45 @@
1
+ # K6_N8_12x12_BD FPGA Virtual Architecture
2
+
3
+ The K6_N8_12x12_BD FPGA is a fixed-size virtual FPGA architecture consisting of configurable logic blocks (CLBs), multipliers (DSP blocks), single-port SRAM blocks (BRAMs), and I/O blocks (IOBs).
4
+
5
+ A summary of K6_N8_12x12_BD resources is shown in the table below
6
+
7
+ Resource Type | Count
8
+ ---------------------|------
9
+ Lookup Tables (LUTs) | 736
10
+ Registers | 736
11
+ 18x18 Multipliers | 1
12
+ 4KB SRAM Blocks | 1
13
+ GPIOs | 352
14
+ Max Clock Domains | 1
15
+
16
+ K6_N8_12x12_BD logic resources are organized into an 14x14 array of components. A 12x12 array of logic blocks is surrounded on the perimeter by four banks of IOBs, one per side of the array. Corner array locations are unused.
17
+
18
+ ## Logic Resources
19
+
20
+ A brief description for K6_N8_12x12_BD logic resources is shown below
21
+
22
+ ### Configurable Logic Block (CLB)
23
+
24
+ Each configurable logic block (CLB) consists of 8 6-input lookup-tables (LUTs). The LUTs in a CLB share common inputs through local routing called a crossbar. All LUT outputs are fed back to the crossbar so that they may be used as inputs within the CLB. Each LUT output can be paired with a flip-flop (register) to synchronize the LUT output to a common clock. Flip-flops not paired with a LUT can accept crossbar inputs directly. All flip-flop usage is automatically determined as part of the RTL-to-bitstream flow and is thus transparent to the user.
25
+
26
+ ### I/O Block (IOB)
27
+
28
+ General purpose I/O blocks (IOBs) are provided to provide a consistent signal interface between signals external to the FPGA and reconfigurable logic. Each IOB contains eight iopad primitives. Each iopad primitive can operate either in input mode or output mode. The IOB thus supports a maximum of eight user I/O signals in any combination of inputs and outputs.
29
+
30
+ ### 18x18 Multiplier Block (DSP)
31
+
32
+ To demonstrate hard arithmetic technology mapping, hard multipliers are offered. The multipliers take two 18-bit inputs and produce a 36-bit output. The block is fully combinational to keep the model as simple as possible. The multipliers are modeled as occupying a 2x2 footprint within the 12x12 array of logic blocks. This sizing is chosen for demonstration purposes and does not reflect the relative sizing of the multiplier to the CLB in any process technology.
33
+
34
+ ### SRAM Block (BRAM)
35
+
36
+ A fixed size single port SRAM is provided to demonstrate memory technology mapping. The memory macro is 4096x8 bits. Each macro is modeled as occupying a 2x2 footprint within the 12x12 array of logic blocks. This sizing is chosen for demonstration purposes and does not reflect the relative sizing of the SRAM to the CLB in any process technology.
37
+
38
+ ### Clocking
39
+
40
+ This architecture uses an ideal clock model; clocks are modeled as globally distributed to all logic resources with zero delay.
41
+
42
+ ## K6_N8_12x12_BD Configuration
43
+
44
+ K6_N8_12x12_BD bitstreams are generated using Logik. An 8-bit wide interface is used to load a generated bitstream.
45
+
@@ -0,0 +1,64 @@
1
+ # Copyright 2025 Zero ASIC Corporation
2
+
3
+ from logiklib import register_part_data
4
+
5
+ from siliconcompiler import FPGA
6
+
7
+
8
+ ####################################################
9
+ # Setup for K6_N8_28x28_BD FPGA
10
+ ####################################################
11
+ def setup():
12
+ part_name = 'K6_N8_28x28_BD'
13
+
14
+ fpga = FPGA(part_name, package=f"logik-fpga-{part_name}")
15
+
16
+ register_part_data(fpga, part_name, f"logik-fpga-{part_name}")
17
+
18
+ fpga.set('fpga', part_name, 'vendor', 'zeroasic')
19
+
20
+ fpga.set('fpga', part_name, 'var', 'vpr_device_code', part_name)
21
+
22
+ fpga.set('fpga', part_name, 'lutsize', 6)
23
+ fpga.set('fpga', part_name, 'var', 'feature_set', [
24
+ 'async_reset', 'async_set', 'enable'])
25
+
26
+ fpga.set('fpga', part_name, 'var', 'vpr_clock_model', 'ideal')
27
+
28
+ fpga.set('fpga', part_name, 'file', 'archfile', 'cad/K6_N8_28x28_BD.xml')
29
+ fpga.set('fpga', part_name, 'file', 'graphfile', 'cad/K6_N8_28x28_BD_rr_graph.xml')
30
+
31
+ for tool in ('vpr', 'yosys'):
32
+ fpga.set('fpga', part_name, 'var', f'{tool}_registers', [
33
+ 'dff', 'dffe', 'dffer', 'dffers', 'dffes', 'dffr', 'dffrs', 'dffs',
34
+ 'dsp_mult', 'bram_sp'
35
+ ])
36
+
37
+ fpga.set('fpga', part_name, 'file', 'yosys_flop_techmap', 'techlib/tech_flops.v')
38
+ fpga.set('fpga', part_name, 'file', 'yosys_memory_techmap', 'techlib/tech_bram.v')
39
+ fpga.set('fpga', part_name, 'file', 'yosys_memory_libmap', 'techlib/bram_memory_map.txt')
40
+ fpga.set('fpga', part_name, 'file', 'yosys_dsp_techmap', 'techlib/tech_dsp.v')
41
+
42
+ # Set the dsp options for the yosys built-in DSP correctly for this
43
+ # architecture
44
+ fpga.set('fpga', part_name, 'var', 'yosys_dsp_options', [
45
+ 'DSP_A_MAXWIDTH=18', 'DSP_A_MINWIDTH=2',
46
+ 'DSP_B_MAXWIDTH=18', 'DSP_B_MINWIDTH=2',
47
+ 'DSP_NAME=_dsp_block_'])
48
+
49
+ fpga.set('fpga', part_name, 'var', 'dsp_blackbox_options', 'BLACKBOX_MACROS')
50
+
51
+ fpga.set('fpga', part_name, 'file', 'bitstream_map', 'cad/K6_N8_28x28_BD_bitstream_map.json')
52
+
53
+ fpga.set('fpga', part_name, 'file', 'constraints_map', 'cad/K6_N8_28x28_BD_constraint_map.json')
54
+
55
+ fpga.set('fpga', part_name, 'var', 'channelwidth', 120)
56
+
57
+ return fpga
58
+
59
+
60
+ #########################
61
+ if __name__ == "__main__":
62
+ fpga = setup()
63
+ assert fpga.check_filepaths()
64
+ fpga.write_manifest(f'{fpga.design}.json')
@@ -0,0 +1,45 @@
1
+ # K6_N8_28x28_BD FPGA Virtual Architecture
2
+
3
+ The K6_N8_28x28_BD FPGA is a fixed-size virtual FPGA architecture consisting of configurable logic blocks (CLBs), multipliers (DSP blocks), single-port SRAM blocks (BRAMs), and I/O blocks (IOBs).
4
+
5
+ A summary of K6_N8_28x28_BD resources is shown in the table below
6
+
7
+ Resource Type | Count
8
+ ---------------------|------
9
+ Lookup Tables (LUTs) | 4832
10
+ Registers | 4832
11
+ 18x18 Multipliers | 9
12
+ 4KB SRAM Blocks | 9
13
+ GPIOs | 864
14
+ Max Clock Domains | 1
15
+
16
+ K6_N8_28x28_BD logic resources are organized into an 30x30 array of components. A 28x28 array of logic blocks is surrounded on the perimeter by four banks of IOBs, one per side of the array. Corner array locations are unused.
17
+
18
+ ## Logic Resources
19
+
20
+ A brief description for K6_N8_28x28_BD logic resources is shown below
21
+
22
+ ### Configurable Logic Block (CLB)
23
+
24
+ Each configurable logic block (CLB) consists of 8 6-input lookup-tables (LUTs). The LUTs in a CLB share common inputs through local routing called a crossbar. All LUT outputs are fed back to the crossbar so that they may be used as inputs within the CLB. Each LUT output can be paired with a flip-flop (register) to synchronize the LUT output to a common clock. Flip-flops not paired with a LUT can accept crossbar inputs directly. All flip-flop usage is automatically determined as part of the RTL-to-bitstream flow and is thus transparent to the user.
25
+
26
+ ### 18x18 Multiplier Block (DSP)
27
+
28
+ To demonstrate hard arithmetic technology mapping, hard multipliers are offered. The multipliers take two 18-bit inputs and produce a 36-bit output. The block is fully combinational to keep the model as simple as possible. The multipliers are modeled as occupying a 2x2 footprint within the 28x28 array of logic blocks. This sizing is chosen for demonstration purposes and does not reflect the relative sizing of the multiplier to the CLB in any process technology.
29
+
30
+ ### SRAM Block (BRAM)
31
+
32
+ A fixed size single port SRAM is provided to demonstrate memory technology mapping. The memory macro is 4096x8 bits. Each macro is modeled as occupying a 2x2 footprint within the 28x28 array of logic blocks. This sizing is chosen for demonstration purposes and does not reflect the relative sizing of the SRAM to the CLB in any process technology.
33
+
34
+ ### I/O Block (IOB)
35
+
36
+ General purpose I/O blocks (IOBs) are provided to provide a consistent signal interface between signals external to the FPGA and reconfigurable logic. Each IOB contains eight iopad primitives. Each iopad primitive can operate either in input mode or output mode. The IOB thus supports a maximum of eight user I/O signals in any combination of inputs and outputs.
37
+
38
+ ### Clocking
39
+
40
+ This architecture uses an ideal clock model; clocks are modeled as globally distributed to all logic resources with zero delay.
41
+
42
+ ## K6_N8_28x28_BD Configuration
43
+
44
+ K6_N8_28x28_BD bitstreams are generated using Logik. An 8-bit wide interface is used to load a generated bitstream.
45
+
@@ -0,0 +1,45 @@
1
+ # Copyright 2024 Zero ASIC Corporation
2
+
3
+ from logiklib import register_part_data
4
+
5
+ from siliconcompiler import FPGA
6
+
7
+
8
+ ####################################################
9
+ # Setup for K6_N8_3x3 FPGA
10
+ ####################################################
11
+ def setup():
12
+ part_name = 'K6_N8_3x3'
13
+
14
+ fpga = FPGA(part_name, package=f"logik-fpga-{part_name}")
15
+
16
+ register_part_data(fpga, part_name, f"logik-fpga-{part_name}")
17
+
18
+ fpga.set('fpga', part_name, 'vendor', 'zeroasic')
19
+
20
+ fpga.set('fpga', part_name, 'var', 'vpr_device_code', 'K6_N8_3x3')
21
+
22
+ fpga.set('fpga', part_name, 'lutsize', 6)
23
+
24
+ fpga.set('fpga', part_name, 'var', 'vpr_clock_model', 'ideal')
25
+
26
+ fpga.set('fpga', part_name, 'file', 'archfile', 'cad/K6_N8_3x3.xml')
27
+ fpga.set('fpga', part_name, 'file', 'graphfile', 'cad/K6_N8_3x3_rr_graph.xml')
28
+
29
+ for tool in ('vpr', 'yosys'):
30
+ fpga.set('fpga', part_name, 'var', f'{tool}_registers', 'dff')
31
+
32
+ fpga.set('fpga', part_name, 'file', 'bitstream_map', 'cad/K6_N8_3x3_bitstream_map.json')
33
+
34
+ fpga.set('fpga', part_name, 'file', 'constraints_map', 'cad/K6_N8_3x3_constraint_map.json')
35
+
36
+ fpga.set('fpga', part_name, 'var', 'channelwidth', 40)
37
+
38
+ return fpga
39
+
40
+
41
+ #########################
42
+ if __name__ == "__main__":
43
+ fpga = setup()
44
+ assert fpga.check_filepaths()
45
+ fpga.write_manifest(f'{fpga.design}.json')
@@ -0,0 +1,35 @@
1
+ # K6_N8_3x3 FPGA Virtual Architecture
2
+
3
+ The K6_N8_3x3 FPGA is a fixed-size virtual FPGA architecture consisting of configurable logic blocks (CLBs) and I/O blocks (IOBs).
4
+
5
+ A summary of K6_N8_3x3 resources is shown in the table below
6
+
7
+ Resource Type | Count
8
+ ---------------------|------
9
+ Lookup Tables (LUTs) | 72
10
+ Registers | 72
11
+ GPIOs | 96
12
+ Max Clock Domains | 1
13
+
14
+ K6_N8_3x3 logic resources are organized into an 5x5 array of components. A 3x3 array of CLBs is surrounded on the perimeter by four banks of IOBs, one per side of the array. Corner array locations are unused.
15
+
16
+ ## Logic Resources
17
+
18
+ A brief description for K6_N8_3x3 logic resources is shown below
19
+
20
+ ### Configurable Logic Block (CLB)
21
+
22
+ Each configurable logic block (CLB) consists of 8 6-input lookup-tables (LUTs). The LUTs in a CLB share common inputs through local routing called a crossbar. All LUT outputs are fed back to the crossbar so that they may be used as inputs within the CLB. Each LUT output can be paired with a flip-flop (register) to synchronize the LUT output to a common clock. Flip-flops not paired with a LUT can accept crossbar inputs directly. All flip-flop usage is automatically determined as part of the RTL-to-bitstream flow and is thus transparent to the user.
23
+
24
+ ### I/O Block (IOB)
25
+
26
+ General purpose I/O blocks (IOBs) are provided to provide a consistent signal interface between signals external to the FPGA and reconfigurable logic. Each IOB contains eight iopad primitives. Each iopad primitive can operate either in input mode or output mode. The IOB thus supports a maximum of eight user I/O signals in any combination of inputs and outputs.
27
+
28
+ ### Clocking
29
+
30
+ This architecture uses an ideal clock model; clocks are modeled as globally distributed to all logic resources with zero delay.
31
+
32
+ ## K6_N8_3x3 Configuration
33
+
34
+ K6_N8_3x3 bitstreams are generated using Logik. An 8-bit wide interface is used to load a generated bitstream.
35
+
@@ -0,0 +1,2 @@
1
+
2
+ # PLACE-HOLDER
File without changes
@@ -0,0 +1,96 @@
1
+ # Z1000 eFPGA
2
+
3
+ The Z1000 eFPGA is a fixed-size eFPGA architecture consisting of configurable logic blocks (CLBs), I/O blocks (IOBs), and a clock I/O block for clock distribution.
4
+
5
+ ## Z1000 Architecture
6
+
7
+ A summary of Z1000 resources is shown in the table below
8
+
9
+ Resource Type | Count
10
+ ---------------------|------
11
+ Lookup Tables (LUTs) | 2048
12
+ Registers | 2048
13
+ GPIOs | 1024
14
+ Max Clock Domains | 4
15
+
16
+ The Z1000 architecture XML file provides a complete specification of how logic resources are arranged in this grid, the port lists of all logic resources, and how logic resources are organized and connected. Hierarchical representations of logic blocks are provided where needed to enable correct, efficient packing and placement of a user's netlist. The architecture XML also provides a delay model for the eFPGA and FASM feature metadata to enable logic block bitstream generation. The Z1000 routing graph XML file encapsulates a complete model of the eFPGA interconnect architecture and contains the FASM feature metadata for interconnect bitstream generation.
17
+
18
+ The following sections summarize the architecture features of Z1000.
19
+
20
+ ### Array and Grid Model
21
+
22
+ Z1000 logic resources are organized into an 18x18 array of components, depicted in the figure below. A 16x16 array of CLBs is surrounded on the perimeter by four banks of IOBs, one per side of the array. Corner array locations are used for programmable interconnect only with the exception of the lower left corner, where the clock IOB is placed.
23
+
24
+ ![z1000_array_diagram](./docs/z1000_Block_Diagram.png )
25
+
26
+ For modeling in VPR, this array of components is arranged on a 20x20 (X,Y) grid. The lower left corner of Z1000 (the clock IOB) is located at (1,1) on this grid. All locations at X=0, X=19, Y=0, and Y=19 are modeled as empty. This perimeter of empty locations is required to model the architecture in VPR correctly.
27
+
28
+ ### Logic Resource Types
29
+
30
+ Brief descriptions and block diagrams for Z1000 logic resources are shown below.
31
+
32
+ #### Configurable Logic Block (CLB)
33
+
34
+ Each configurable logic block (CLB) consists of 8 4-input basic logic elements (BLEs). A block diagram of the BLE is shown below. The BLE contains a 4-input lookup table (LUT) a configurable flip-flop, and a multiplexer that selects whether the primary output of the BLE comes from the flip-flop or directly from the LUT. The flip-flop output is also routed out of the BLE as a secondary output; this secondary output is connected only to local interconnect in the CLB.
35
+
36
+ ![ble_block_diagram](./docs/BLE4_Block_Diagram.png )
37
+
38
+ The BLEs in a CLB share 18 common inputs through the CLB local interconnect, an array of multiplexers referred to as the CLB crossbar. Each BLE input is driven by a dedicated crossbar multiplexer that selects from a subset of the CLB inputs, BLE primary outputs, and BLE secondary outputs. The CLB inputs are subdivided between north, south, east, and west sides of the CLB to improve their interface to the eFPGA global interconnect. The BLE primary outputs are also outputs of the CLB and route directly to eFPGA global interconnect. The overall CLB block diagram is shown below. The BLE output feedback paths to the crossbar are not shown in the diagram to preserve diagram clarity.
39
+
40
+ ![clb_block_diagram](./docs/CLB4_Block_Diagram.png)
41
+
42
+ #### I/O Block (IOB)
43
+
44
+ General purpose I/O blocks (IOBs) are provided to provide a consistent signal interface between signals external to the eFPGA and reconfigurable logic. Each IOB contains eight iopad primitives. Each iopad primitive can operate either in input mode or output mode. The IOB thus supports a maximum of eight user I/O signals in any combination of inputs and outputs. During RTL-to-bitstream generation, each top level RTL port directly maps to an iopad primitives via pin constraints.
45
+
46
+ The figure below shows a block diagram of the iopad primitive. Each iopad enables a single signal to be connected . The data direction is determined during bitstream generation and stored in a configuration bit that is directly wired to an output enable signal pad_oe that is accessible as a top level signal of the eFPGA. When in input mode, the pad_in signal is received from external logic and passed to eFPGA logic via the inpad signal. Similarly, in output mode the outpad signal is received from eFPGA logic and passed to pad_out.
47
+
48
+ ![iob_block_diagram](./docs/IOB_Block_Diagram.png)
49
+
50
+ #### Clock I/O Block (Clock IOB)
51
+
52
+ A dedicated I/O block is provided that is only used for delivering clocks to the programmable logic. This I/O block is referred to as the clock IOB. It is constructed from the same iopad primitive as the general purpose I/O blocks, but internally connected to the eFPGA clock network rather than to programmable interconnect.
53
+
54
+ ## Z1000 Pin Constraints
55
+
56
+ Z1000 implements the signals in the table below as valid pin names for specifying pin constraints in a JSON pin constraints file (PCF). Standard bus notatation using square brackets is required for all pins in the PCF. For example, to constrain a user input signal `foo` to bit 17 of `gpio_in_east`, the following content should be included in the PCF file
57
+
58
+ ```
59
+ "foo": {
60
+ "direction": "input",
61
+ "pin": "gpio_in_east[17]"
62
+ },
63
+ ```
64
+
65
+ > **_NOTE:_** User clock signals must be mapped to the gpio_in_clk bus
66
+
67
+ Pin Name | Direction | MSB | LSB | Purpose
68
+ --------------------------|-----------|-----|-----|---------
69
+ gpio_in_clk | input | 3 | 0 | User clocks
70
+ gpio_in_south | input | 255 | 0 | South side GPIO inputs
71
+ gpio_in_north | input | 255 | 0 | North side GPIO inputs
72
+ gpio_in_west | input | 255 | 0 | West side GPIO inputs
73
+ gpio_in_east | input | 255 | 0 | East side GPIO inputs
74
+ gpio_out_south | output | 255 | 0 | South side GPIO outputs
75
+ gpio_oe_south | output | 255 | 0 | South side GPIO output enables
76
+ gpio_out_north | output | 255 | 0 | North side GPIO outputs
77
+ gpio_oe_north | output | 255 | 0 | North side GPIO output enables
78
+ gpio_out_west | output | 255 | 0 | West side GPIO outputs
79
+ gpio_oe_west | output | 255 | 0 | West side GPIO output enables
80
+ gpio_out_east | output | 255 | 0 | East side GPIO outputs
81
+ gpio_oe_east | output | 255 | 0 | East side GPIO output enables
82
+
83
+ ## Z1000 Bitstream Mapping
84
+
85
+ The Z1000 bitstream format is organized into a four-dimensional array of configuration bits. The four dimensions are the VPR grid X coordinate, VPR grid Y coordinate, word address, and bit index.
86
+
87
+ The table below shows the minimum and maximum array values for this array. Note that not all positions in the array contain valid configuration bits.
88
+
89
+ Index | Min | Max |
90
+ ------------|------|-----|
91
+ X | 0 | 19 |
92
+ Y | 0 | 19 |
93
+ Address | 0 | 108 |
94
+ Bit Index | 0 | 7 |
95
+
96
+ The Z1000 bitstream map file specifies a mapping from these array indices to each FASM feature defined in the Z1000 VPR architecture file and routing graph XML file.
@@ -0,0 +1,15 @@
1
+ {
2
+ "name": "z1000",
3
+ "fpga_x_size": 16,
4
+ "fpga_y_size": 16,
5
+ "num_routing_channels": 100,
6
+ "num_clb_inputs": 18,
7
+ "lut_size": 4,
8
+ "bles_per_clb": 8,
9
+ "outputs_per_ble": 1,
10
+ "crossbar_size": 15,
11
+ "sb_fraction": 0.15,
12
+ "logic_fraction": 0.15,
13
+ "ios_per_iob": 16,
14
+ "num_fracturable_elements": 1
15
+ }
@@ -0,0 +1,61 @@
1
+ # Copyright 2025 Zero ASIC Corporation
2
+ # Licensed under the Apache 2.0 License (see LICENSE for details)
3
+
4
+ from logiklib import register_part_data
5
+
6
+ from siliconcompiler import FPGA
7
+
8
+
9
+ ####################################################
10
+ # Setup for z1000 FPGA
11
+ ####################################################
12
+ def setup():
13
+ '''
14
+ z1000 is the first in a series of open FPGA architectures.
15
+ The baseline z1000 part is an architecture with 2K LUTs
16
+ and no hard macros.
17
+ '''
18
+
19
+ part_name = 'z1000'
20
+
21
+ fpga = FPGA(part_name, package=f"zeroasic-efpga-{part_name}")
22
+
23
+ register_part_data(fpga, part_name, f"zeroasic-efpga-{part_name}")
24
+
25
+ fpga.set('fpga', part_name, 'vendor', 'zeroasic')
26
+
27
+ # Set a variable for VPR to use to detect the correct <fixed_layout> section
28
+ # of the architecture XML file
29
+ fpga.set('fpga', part_name, 'var', 'vpr_device_code', part_name)
30
+
31
+ fpga.set('fpga', part_name, 'lutsize', 4)
32
+ fpga.set('fpga', part_name, 'var', 'feature_set', [
33
+ 'async_reset', 'enable'])
34
+
35
+ fpga.set('fpga', part_name, 'var', 'vpr_clock_model', 'route')
36
+
37
+ fpga.set('fpga', part_name, 'file', 'archfile', f'cad/{part_name}.xml')
38
+ fpga.set('fpga', part_name, 'file', 'graphfile', f'cad/{part_name}_rr_graph.xml')
39
+
40
+ for tool in ('vpr', 'yosys'):
41
+ fpga.set('fpga', part_name, 'var', f'{tool}_registers', [
42
+ 'dff',
43
+ 'dffr',
44
+ 'dffe',
45
+ 'dffer'])
46
+
47
+ fpga.set('fpga', part_name, 'file', 'yosys_flop_techmap', 'techlib/tech_flops.v')
48
+
49
+ fpga.set('fpga', part_name, 'file', 'bitstream_map', f'cad/{part_name}_bitstream_map.json')
50
+
51
+ fpga.set('fpga', part_name, 'file', 'constraints_map', f'cad/{part_name}_constraint_map.json')
52
+
53
+ fpga.set('fpga', part_name, 'var', 'channelwidth', 100)
54
+
55
+ return fpga
56
+
57
+
58
+ #########################
59
+ if __name__ == "__main__":
60
+ fpga = setup()
61
+ fpga.write_manifest(f'{fpga.design}.json')