lambdapdk 0.1.56__py3-none-any.whl → 0.2.0rc2__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.
@@ -1,23 +1,18 @@
1
+ from pathlib import Path
1
2
 
2
- import os
3
- import siliconcompiler
4
- from lambdapdk import register_data_source
3
+ from lambdapdk import LambdaPDK, _LambdaPath
5
4
 
6
5
 
7
6
  pdk_rev = '0854e9bcd558b68c573149038b4c95706314e2f1'
8
7
 
9
8
 
10
- def register_ihp130_data_source(chip):
11
- chip.register_source(
12
- 'ihp130',
13
- path='git+https://github.com/IHP-GmbH/IHP-Open-PDK',
14
- ref=pdk_rev)
9
+ class _IHP130Path(_LambdaPath):
10
+ def __init__(self):
11
+ super().__init__()
12
+ self.set_dataroot("ihp130", "git+https://github.com/IHP-GmbH/IHP-Open-PDK", pdk_rev)
15
13
 
16
14
 
17
- ####################################################
18
- # PDK Setup
19
- ####################################################
20
- def setup():
15
+ class IHP130PDK(LambdaPDK, _IHP130Path):
21
16
  '''
22
17
  130nm BiCMOS Open Source PDK, dedicated for Analog/Digital, Mixed Signal and RF Design
23
18
 
@@ -38,110 +33,80 @@ def setup():
38
33
 
39
34
  * https://github.com/IHP-GmbH/IHP-Open-PDK
40
35
  '''
41
-
42
- foundry = 'Leibniz-Institut für innovative Mikroelektronik'
43
- process = 'ihp130'
44
- stackup = '5M2TL'
45
-
46
- node = 130
47
- # TODO: dummy numbers, only matter for cost estimation
48
- wafersize = 300
49
- hscribe = 0.1
50
- vscribe = 0.1
51
- edgemargin = 2
52
-
53
- lpdkdir = os.path.join('lambdapdk', 'ihp130', 'base')
54
-
55
- pdk = siliconcompiler.PDK(process, package='ihp130')
56
- register_ihp130_data_source(pdk)
57
- register_data_source(pdk)
58
-
59
- # process name
60
- pdk.set('pdk', process, 'foundry', foundry)
61
- pdk.set('pdk', process, 'node', node)
62
- pdk.set('pdk', process, 'version', pdk_rev)
63
- pdk.set('pdk', process, 'stackup', stackup)
64
- pdk.set('pdk', process, 'wafersize', wafersize)
65
- pdk.set('pdk', process, 'edgemargin', edgemargin)
66
- pdk.set('pdk', process, 'scribe', (hscribe, vscribe))
67
-
68
- # APR Setup
69
- # TODO: remove libtype
70
- for tool in ('openroad', 'klayout', 'magic'):
71
- # Add unithd for backwards compatibility
72
- pdk.set('pdk', process, 'aprtech', tool, stackup, '9t', 'lef',
73
- 'ihp-sg13g2/libs.ref/sg13g2_stdcell/lef/sg13g2_tech.lef')
74
-
75
- pdk.set('pdk', process, 'minlayer', stackup, 'Metal2')
76
- pdk.set('pdk', process, 'maxlayer', stackup, 'Metal5')
77
-
78
- # DRC Runsets
79
- # pdk.set('pdk', process, 'drc', 'runset', 'magic', stackup, 'basic',
80
- # pdkdir + '/setup/magic/sky130A.tech')
81
-
82
- # LVS Runsets
83
- # pdk.set('pdk', process, 'lvs', 'runset', 'netgen', stackup, 'basic',
84
- # pdkdir + '/setup/netgen/lvs_setup.tcl')
85
-
86
- # Layer map and display file
87
- pdk.set('pdk', process, 'layermap', 'klayout', 'def', 'klayout', stackup,
88
- 'ihp-sg13g2/libs.tech/klayout/tech/sg13g2.lyt')
89
- pdk.set('pdk', process, 'display', 'klayout', stackup,
90
- 'ihp-sg13g2/libs.tech/klayout/tech/sg13g2.lyp')
91
-
92
- pdk.set('pdk', process, 'layermap', 'klayout', 'def', 'gds', stackup,
93
- 'ihp-sg13g2/libs.tech/klayout/tech/sg13g2.map')
94
-
95
- # Openroad global routing grid derating
96
- openroad_layer_adjustments = {
97
- 'Metal1': 0.25,
98
- 'Metal2': 0.25,
99
- 'Metal3': 0.25,
100
- 'Metal4': 0.25,
101
- 'Metal5': 0.25,
102
- 'TopMetal1': 0.00,
103
- 'TopMetal2': 0.00,
104
- }
105
- for layer, adj in openroad_layer_adjustments.items():
106
- pdk.set('pdk', process, 'var', 'openroad', f'{layer}_adjustment', stackup, str(adj))
107
-
108
- pdk.set('pdk', process, 'var', 'openroad', 'rclayer_signal', stackup, 'Metal2')
109
- pdk.set('pdk', process, 'var', 'openroad', 'rclayer_clock', stackup, 'Metal5')
110
-
111
- pdk.set('pdk', process, 'var', 'openroad', 'pin_layer_vertical', stackup, 'Metal2')
112
- pdk.set('pdk', process, 'var', 'openroad', 'pin_layer_horizontal', stackup, 'Metal3')
113
-
114
- # PEX
115
- for corner in ["typical"]:
116
- pdk.set('pdk', process, 'pexmodel', 'openroad', stackup, corner,
117
- lpdkdir + '/pex/openroad/' + corner + '.tcl', package='lambdapdk')
118
- pdk.set('pdk', process, 'pexmodel', 'openroad-openrcx', stackup, corner,
119
- lpdkdir + '/pex/openroad/' + corner + '.rules', package='lambdapdk')
120
-
121
- # DRC
122
- drcs = {
123
- "maximal": 'ihp-sg13g2/libs.tech/klayout/tech/drc/sg13g2_maximal.lydrc',
124
- "minimal": 'ihp-sg13g2/libs.tech/klayout/tech/drc/sg13g2_minimal.lydrc'
125
- }
126
- for drc, runset in drcs.items():
127
- pdk.set('pdk', process, 'drc', 'runset', 'klayout', stackup, drc, runset)
128
-
129
- key = f'drc_params:{drc}'
130
- pdk.add('pdk', process, 'var', 'klayout', stackup, key, 'in_gds=<input>')
131
- pdk.add('pdk', process, 'var', 'klayout', stackup, key, 'cell=<topcell>')
132
- pdk.add('pdk', process, 'var', 'klayout', stackup, key, 'report_file=<report>')
133
-
134
- # Documentation
135
- pdk.set('pdk', process, 'doc', 'overview',
136
- 'ihp-sg13g2/libs.doc/doc/SG13G2_os_process_spec.pdf')
137
- pdk.set('pdk', process, 'doc', 'drc_rules',
138
- 'ihp-sg13g2/libs.doc/doc/SG13G2_os_layout_rules.pdf')
139
-
140
- return pdk
141
-
142
-
143
- #########################
144
- if __name__ == "__main__":
145
- pdk = setup()
146
- pdk.write_manifest(f'{pdk.top()}.json')
147
- pdk.check_filepaths()
36
+ def __init__(self):
37
+ super().__init__()
38
+ self.set_name("ihp130")
39
+
40
+ self.set_foundry("Leibniz-Institut für innovative Mikroelektronik")
41
+ self.set_version(pdk_rev)
42
+ self.set_node(130)
43
+ self.set_stackup("5M2TL")
44
+
45
+ pdk_path = Path("lambdapdk", "ihp130", "base")
46
+
47
+ # Docs
48
+ with self.active_dataroot("ihp130"):
49
+ self.add_doc("quickstart", "ihp-sg13g2/libs.doc/doc/SG13G2_os_process_spec.pdf")
50
+ self.add_doc("signoff", "ihp-sg13g2/libs.doc/doc/SG13G2_os_layout_rules.pdf")
51
+
52
+ with self.active_dataroot("ihp130"):
53
+ # APR Setup
54
+ with self.active_fileset("views.lef"):
55
+ self.add_file("ihp-sg13g2/libs.ref/sg13g2_stdcell/lef/sg13g2_tech.lef")
56
+ for tool in ('openroad', 'klayout', 'magic'):
57
+ self.add_aprtechfileset(tool)
58
+
59
+ with self.active_fileset("layermap"):
60
+ self.add_file("ihp-sg13g2/libs.tech/klayout/tech/sg13g2.map", filetype="layermap")
61
+
62
+ self.set_aprroutinglayers(min="Metal2", max="Metal5")
63
+
64
+ # Klayout setup
65
+ with self.active_dataroot("ihp130"):
66
+ with self.active_fileset("klayout.techmap"):
67
+ self.add_file("ihp-sg13g2/libs.tech/klayout/tech/sg13g2.lyt", filetype="layermap")
68
+ self.add_file("ihp-sg13g2/libs.tech/klayout/tech/sg13g2.lyp", filetype="display")
69
+ self.add_layermapfileset("klayout", "def", "klayout")
70
+ self.add_displayfileset("klayout")
71
+ self.add_layermapfileset("klayout", "def", "gds", fileset="layermap")
72
+
73
+ # OpenROAD setup
74
+ self.set_openroad_rclayers(signal="Metal2", clock="Metal5")
75
+ self.add_openroad_pinlayers(vertical="Metal2", horizontal="Metal3")
76
+
77
+ # Openroad global routing grid derating
78
+ openroad_layer_adjustments = {
79
+ 'Metal1': 0.25,
80
+ 'Metal2': 0.25,
81
+ 'Metal3': 0.25,
82
+ 'Metal4': 0.25,
83
+ 'Metal5': 0.25,
84
+ 'TopMetal1': 0.00,
85
+ 'TopMetal2': 0.00
86
+ }
87
+ for layer, adj in openroad_layer_adjustments.items():
88
+ self.set_openroad_globalroutingderating(layer, adj)
89
+
90
+ # PEX
91
+ with self.active_dataroot("lambdapdk"):
92
+ with self.active_fileset("openroad.pex"):
93
+ self.add_file(pdk_path / "pex" / "openroad" / "typical.tcl", filetype="tcl")
94
+ self.add_file(pdk_path / "pex" / "openroad" / "typical.rules", filetype="openrcx")
95
+
96
+ self.add_pexmodelfileset("openroad", "typical")
97
+ self.add_pexmodelfileset("openroad-openrcx", "typical")
98
+
99
+ # DRC
100
+ drcs = {
101
+ "maximal": 'ihp-sg13g2/libs.tech/klayout/tech/drc/sg13g2_maximal.lydrc',
102
+ "minimal": 'ihp-sg13g2/libs.tech/klayout/tech/drc/sg13g2_minimal.lydrc'
103
+ }
104
+ with self.active_dataroot("ihp130"):
105
+ for drc, runset in drcs.items():
106
+ with self.active_fileset(f"klayout.drc.{drc}"):
107
+ self.add_file(runset, filetype="drc")
108
+ self.add_runsetfileset("drc", "klayout", drc)
109
+
110
+ self.add_klayout_drcparam(drc, "in_gds=<input>")
111
+ self.add_klayout_drcparam(drc, "cell=<topcell>")
112
+ self.add_klayout_drcparam(drc, "report_file=<report>")
@@ -1,57 +1,70 @@
1
- import os
2
- import siliconcompiler
3
- from lambdapdk import register_data_source
4
- from lambdapdk.ihp130 import register_ihp130_data_source
1
+ from pathlib import Path
5
2
 
3
+ from lambdapdk import LambdaLibrary
4
+ from lambdapdk.ihp130 import IHP130PDK, _IHP130Path
6
5
 
7
- def setup():
6
+
7
+ class _IHP130_IOLibrary(LambdaLibrary, _IHP130Path):
8
8
  '''
9
9
  IHP 130 IO Cells
10
10
  '''
11
- libdir = "lambdapdk/ihp130/libs/sg13g2_io"
11
+ def __init__(self, voltage):
12
+ super().__init__()
13
+ self.set_name(f"sg13g2_io_{voltage}")
14
+
15
+ path_base = Path("lambdapdk", "ihp130", "libs", "sg13g2_io")
12
16
 
13
- lib = siliconcompiler.Library('sg13g2_io', package='ihp130')
14
- register_ihp130_data_source(lib)
15
- register_data_source(lib)
17
+ self.add_asic_pdk(IHP130PDK())
16
18
 
17
- # pdk
18
- lib.set('option', 'pdk', 'ihp130')
19
+ with self.active_dataroot("ihp130"):
20
+ if voltage == "1p2V":
21
+ for corner_name, filename in [
22
+ ('slow', 'sg13g2_io_slow_1p08V_3p0V_125C.lib'),
23
+ ('typical', 'sg13g2_io_typ_1p2V_3p3V_25C.lib'),
24
+ ('fast', 'sg13g2_io_fast_1p32V_3p6V_m40C.lib')]:
25
+ with self.active_fileset(f"models.timing.{corner_name}.nldm"):
26
+ self.add_file(f"ihp-sg13g2/libs.ref/sg13g2_io/lib/{filename}")
27
+ self.add_asic_libcornerfileset(corner_name, "nldm")
28
+ else:
29
+ for corner_name, filename in [
30
+ ('slow', 'sg13g2_io_slow_1p35V_3p0V_125C.lib'),
31
+ ('typical', 'sg13g2_io_typ_1p5V_3p3V_25C.lib'),
32
+ ('fast', 'sg13g2_io_fast_1p65V_3p6V_m40C.lib')]:
33
+ with self.active_fileset(f"models.timing.{corner_name}.nldm"):
34
+ self.add_file(f"ihp-sg13g2/libs.ref/sg13g2_io/lib/{filename}")
35
+ self.add_asic_libcornerfileset(corner_name, "nldm")
19
36
 
20
- lib.set('output', 'slow', 'nldm',
21
- 'ihp-sg13g2/libs.ref/sg13g2_io/lib/sg13g2_io_slow_1p08V_3p0V_125C.lib')
22
- lib.set('output', 'typical', 'nldm',
23
- 'ihp-sg13g2/libs.ref/sg13g2_io/lib/sg13g2_io_typ_1p5V_3p3V_25C.lib')
24
- lib.set('output', 'fast', 'nldm',
25
- 'ihp-sg13g2/libs.ref/sg13g2_io/lib/sg13g2_io_fast_1p32V_3p6V_m40C.lib')
37
+ with self.active_fileset("models.spice"):
38
+ self.add_file("ihp-sg13g2/libs.ref/sg13g2_io/spice/sg13g2_io.spi", filetype="spice")
26
39
 
27
- for corner in ('slow', 'typical', 'fast'):
28
- lib.set('output', corner, 'spice',
29
- 'ihp-sg13g2/libs.ref/sg13g2_io/spice/sg13g2_io.spi')
40
+ with self.active_dataroot("ihp130"):
41
+ with self.active_fileset("models.physical"):
42
+ self.add_file("ihp-sg13g2/libs.ref/sg13g2_io/lef/sg13g2_io.lef")
43
+ self.add_file("ihp-sg13g2/libs.ref/sg13g2_io/gds/sg13g2_io.gds")
44
+ self.add_asic_aprfileset()
30
45
 
31
- lib.set('output', '5M2TL', 'lef', 'ihp-sg13g2/libs.ref/sg13g2_io/lef/sg13g2_io.lef')
32
- lib.set('output', '5M2TL', 'cdl', 'ihp-sg13g2/libs.ref/sg13g2_io/cdl/sg13g2_io.cdl')
33
- lib.add('output', '5M2TL', 'gds', 'ihp-sg13g2/libs.ref/sg13g2_io/gds/sg13g2_io.gds')
46
+ with self.active_fileset("models.lvs"):
47
+ self.add_file("ihp-sg13g2/libs.ref/sg13g2_io/cdl/sg13g2_io.cdl")
48
+ self.add_asic_aprfileset()
34
49
 
35
- lib.set('asic', 'cells', 'filler', ['sg13g2_Filler200',
36
- 'sg13g2_Filler400',
37
- 'sg13g2_Filler1000',
38
- 'sg13g2_Filler2000',
39
- 'sg13g2_Filler4000',
40
- 'sg13g2_Filler10000'])
50
+ self.add_asic_celllist('filler', ['sg13g2_Filler200',
51
+ 'sg13g2_Filler400',
52
+ 'sg13g2_Filler1000',
53
+ 'sg13g2_Filler2000',
54
+ 'sg13g2_Filler4000',
55
+ 'sg13g2_Filler10000'])
41
56
 
42
- lib.set('output', 'blackbox', 'verilog',
43
- os.path.join(libdir, 'blackbox', 'sg13g2_io.v'), package='lambdapdk')
57
+ with self.active_dataroot("lambdapdk"):
58
+ with self.active_fileset("models.blackbox"):
59
+ self.add_file(path_base / "blackbox" / "sg13g2_io.v")
60
+ self.add_yosys_blackbox_fileset("models.blackbox")
44
61
 
45
- lambda_lib = siliconcompiler.Library('lambdalib_sg13g2_io', package='lambdapdk')
46
- register_data_source(lambda_lib)
47
- lambda_lib.add('option', 'ydir', os.path.join(libdir, 'lambda'))
48
- lambda_lib.use(lib)
49
- lambda_lib.set('asic', 'macrolib', lib.design)
50
62
 
51
- return [lib, lambda_lib]
63
+ class IHP130_IO_1p2(_IHP130_IOLibrary):
64
+ def __init__(self):
65
+ super().__init__("1p2")
52
66
 
53
67
 
54
- #########################
55
- if __name__ == "__main__":
56
- for lib in setup(siliconcompiler.Chip('<lib>')):
57
- lib.write_manifest(f'{lib.top()}.json')
68
+ class IHP130_IO_1p5(_IHP130_IOLibrary):
69
+ def __init__(self):
70
+ super().__init__("1p5")
@@ -1,52 +1,94 @@
1
- from siliconcompiler import Chip, Library
2
- from lambdapdk import register_data_source
3
- from lambdapdk.ihp130 import register_ihp130_data_source
4
-
5
-
6
- def setup():
7
- libs = []
8
- stackup = '5M2TL'
9
-
10
- for config in ('1024x64', '2048x64', '256x48', '256x64', '512x64', '64x64'):
11
- mem_name = f'RM_IHPSG13_1P_{config}_c2_bm_bist'
12
- lib = Library(mem_name, package='ihp130')
13
- register_ihp130_data_source(lib)
14
- register_data_source(lib)
15
- path_base = 'ihp-sg13g2/libs.ref/sg13g2_sram'
16
- lib.add('output', stackup, 'lef', f'{path_base}/lef/{mem_name}.lef')
17
- lib.add('output', stackup, 'gds', f'{path_base}/gds/{mem_name}.gds')
18
- lib.add('output', stackup, 'cdl', f'{path_base}/cdl/{mem_name}.cdl')
19
-
20
- lib.add('output', 'typ', 'nldm', f'{path_base}/lib/{mem_name}_typ_1p20V_25C.lib')
21
- lib.add('output', 'slow', 'nldm', f'{path_base}/lib/{mem_name}_slow_1p08V_125C.lib')
22
- lib.add('output', 'fast', 'nldm', f'{path_base}/lib/{mem_name}_fast_1p32V_m55C.lib')
23
-
24
- lib.add('output', 'rtl', 'verilog', f'{path_base}/verilog/{mem_name}.v')
25
- lib.add('output', 'rtl', 'verilog',
26
- f'{path_base}/verilog/RM_IHPSG13_1P_core_behavioral_bm_bist.v')
27
-
28
- lib.set('option', 'file', 'openroad_pdngen',
29
- 'lambdapdk/ihp130/libs/sg13g2_sram/apr/openroad/pdngen.tcl',
30
- package='lambdapdk')
31
- lib.set('option', 'file', 'openroad_global_connect',
32
- 'lambdapdk/ihp130/libs/sg13g2_sram/apr/openroad/global_connect.tcl',
33
- package='lambdapdk')
34
-
35
- libs.append(lib)
36
-
37
- lambda_lib = Library('lambdalib_sg13g2_sram', package='lambdapdk')
38
- register_data_source(lambda_lib)
39
- lambda_lib.add('option', 'ydir', 'lambdapdk/ihp130/libs/sg13g2_sram/lambda')
40
- for lib in libs:
41
- lambda_lib.use(lib)
42
- lambda_lib.add('asic', 'macrolib', lib.design)
43
-
44
- libs.append(lambda_lib)
45
-
46
- return libs
47
-
48
-
49
- #########################
50
- if __name__ == "__main__":
51
- for lib in setup(Chip('<lib>')):
52
- lib.write_manifest(f'{lib.top()}.json')
1
+ from pathlib import Path
2
+
3
+ from lambdalib import LambalibTechLibrary
4
+ from lambdapdk import LambdaLibrary, _LambdaPath
5
+ from lambdapdk.ihp130 import IHP130PDK, _IHP130Path
6
+
7
+
8
+ class _IHP130SRAMLibrary(LambdaLibrary, _IHP130Path):
9
+ def __init__(self, config):
10
+ super().__init__()
11
+ self.set_name(f'RM_IHPSG13_1P_{config}_c2_bm_bist')
12
+
13
+ self.add_asic_pdk(IHP130PDK())
14
+
15
+ path_base = Path("lambdapdk", "ihp130", "libs", "sg13g2_sram")
16
+
17
+ with self.active_dataroot("ihp130"):
18
+ with self.active_fileset("models.physical"):
19
+ self.add_file(f"ihp-sg13g2/libs.ref/sg13g2_sram/lef/{self.name}.lef")
20
+ self.add_file(f"ihp-sg13g2/libs.ref/sg13g2_sram/gds/{self.name}.gds")
21
+ self.add_asic_aprfileset()
22
+
23
+ with self.active_fileset("models.lvs"):
24
+ self.add_file(f"ihp-sg13g2/libs.ref/sg13g2_sram/cdl/{self.name}.cdl")
25
+ self.add_asic_aprfileset()
26
+
27
+ for corner_name, filename in [
28
+ ('slow', f'{self.name}_slow_1p08V_125C.lib'),
29
+ ('typical', f'{self.name}_typ_1p20V_25C.lib'),
30
+ ('fast', f'{self.name}_fast_1p32V_m55C.lib')]:
31
+ with self.active_fileset(f"models.timing.nldm.{corner_name}"):
32
+ self.add_file(f"ihp-sg13g2/libs.ref/sg13g2_sram/lib/{filename}")
33
+ self.add_asic_libcornerfileset(corner_name, "nldm")
34
+
35
+ with self.active_fileset("rtl"):
36
+ self.add_file(f"ihp-sg13g2/libs.ref/sg13g2_sram/verilog/{self.name}.v")
37
+ self.add_file("ihp-sg13g2/libs.ref/sg13g2_sram/verilog/"
38
+ "RM_IHPSG13_1P_core_behavioral_bm_bist.v")
39
+
40
+ with self.active_dataroot("lambdapdk"):
41
+ self.add_openroad_power_grid_file(path_base / "apr" / "openroad" / "pdngen.tcl")
42
+ self.add_openroad_global_connect_file(
43
+ path_base / "apr" / "openroad" / "global_connect.tcl")
44
+
45
+
46
+ class IHP130_SRAM_1024x64(_IHP130SRAMLibrary):
47
+ def __init__(self):
48
+ super().__init__("1024x64")
49
+
50
+
51
+ class IHP130_SRAM_2048x64(_IHP130SRAMLibrary):
52
+ def __init__(self):
53
+ super().__init__("2048x64")
54
+
55
+
56
+ class IHP130_SRAM_256x48(_IHP130SRAMLibrary):
57
+ def __init__(self):
58
+ super().__init__("256x48")
59
+
60
+
61
+ class IHP130_SRAM_256x64(_IHP130SRAMLibrary):
62
+ def __init__(self):
63
+ super().__init__("256x64")
64
+
65
+
66
+ class IHP130_SRAM_512x64(_IHP130SRAMLibrary):
67
+ def __init__(self):
68
+ super().__init__("512x64")
69
+
70
+
71
+ class IHP130_SRAM_64x64(_IHP130SRAMLibrary):
72
+ def __init__(self):
73
+ super().__init__("64x64")
74
+
75
+
76
+ class IHP130Lambdalib_SinglePort(LambalibTechLibrary, _LambdaPath):
77
+ def __init__(self):
78
+ super().__init__("la_spram", [
79
+ IHP130_SRAM_1024x64,
80
+ IHP130_SRAM_2048x64,
81
+ IHP130_SRAM_256x48,
82
+ IHP130_SRAM_256x64,
83
+ IHP130_SRAM_512x64,
84
+ IHP130_SRAM_64x64])
85
+ self.set_name("ihp130_la_spram")
86
+
87
+ # version
88
+ self.set_version("v1")
89
+
90
+ lib_path = Path("lambdapdk", "ihp130", "libs", "sg13g2_sram")
91
+
92
+ with self.active_dataroot("lambdapdk"):
93
+ with self.active_fileset("rtl"):
94
+ self.add_file(lib_path / "lambda" / "la_spram.v")