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,139 +1,117 @@
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 _IHP130StdCell(LambdaLibrary, _IHP130Path):
8
8
  '''
9
- Standrad cell library for IHP130
9
+ Standard cell library for IHP130
10
10
  '''
11
- libname = 'sg13g2_stdcell'
12
- process = 'ihp130'
13
- stackup = '5M2TL'
14
- libtype = '9t'
15
- version = 'r1p0'
16
-
17
- lib = siliconcompiler.Library(libname, package='ihp130')
18
- register_ihp130_data_source(lib)
19
- register_data_source(lib)
20
-
21
- libdir = os.path.join('lambdapdk', process, 'libs', libname)
22
-
23
- # version
24
- lib.set('package', 'version', version)
25
-
26
- # list of stackups supported
27
- lib.set('option', 'stackup', stackup)
28
-
29
- # list of pdks supported
30
- lib.set('option', 'pdk', process)
31
-
32
- # footprint/type/sites
33
- lib.set('asic', 'libarch', libtype)
34
- lib.set('asic', 'site', libtype, 'CoreSite')
35
-
36
- # timing
37
- lib.add('output', 'typ', 'nldm',
38
- 'ihp-sg13g2/libs.ref/sg13g2_stdcell/lib/sg13g2_stdcell_typ_1p20V_25C.lib')
39
- lib.add('output', 'fast', 'nldm',
40
- 'ihp-sg13g2/libs.ref/sg13g2_stdcell/lib/sg13g2_stdcell_fast_1p32V_m40C.lib')
41
- lib.add('output', 'slow', 'nldm',
42
- 'ihp-sg13g2/libs.ref/sg13g2_stdcell/lib/sg13g2_stdcell_slow_1p08V_125C.lib')
43
-
44
- # lef
45
- lib.add('output', stackup, 'lef',
46
- 'ihp-sg13g2/libs.ref/sg13g2_stdcell/lef/sg13g2_stdcell.lef')
47
-
48
- # gds
49
- lib.add('output', stackup, 'gds',
50
- 'ihp-sg13g2/libs.ref/sg13g2_stdcell/gds/sg13g2_stdcell.gds')
51
-
52
- # cdl
53
- lib.add('output', stackup, 'cdl',
54
- 'ihp-sg13g2/libs.ref/sg13g2_stdcell/cdl/sg13g2_stdcell.cdl')
55
-
56
- lib.add('output', 'rtl', 'verilog',
57
- 'ihp-sg13g2/libs.ref/sg13g2_stdcell/verilog/sg13g2_stdcell.v')
58
-
59
- # tie cells
60
- lib.add('asic', 'cells', 'tie', ["sg13g2_tiehi",
61
- "sg13g2_tielo"])
62
-
63
- # hold cells
64
- lib.add('asic', 'cells', 'hold', ["sg13g2_dlygate4sd1_1",
65
- "sg13g2_dlygate4sd2_1",
66
- "sg13g2_dlygate4sd3_1"])
67
-
68
- # filler
69
- lib.add('asic', 'cells', 'filler', ["sg13g2_fill_1",
70
- "sg13g2_fill_2",
71
- "sg13g2_fill_4",
72
- "sg13g2_fill_8"])
73
-
74
- # decap
75
- lib.add('asic', 'cells', 'decap', ["sg13g2_decap_4",
76
- "sg13g2_decap_8"])
77
-
78
- # antenna
79
- lib.add('asic', 'cells', 'antenna', ["sg13g2_antennanp"])
80
-
81
- # Dont use
82
- lib.add('asic', 'cells', 'dontuse', ["sg13g2_lgcp_1",
83
- "sg13g2_sighold",
84
- "sg13g2_slgcp_1",
85
- "sg13g2_dfrbp_2"])
86
-
87
- # Techmap
88
- lib.add('option', 'file', 'yosys_techmap',
89
- libdir + '/techmap/yosys/cells_latch.v',
90
- package='lambdapdk')
91
- lib.add('option', 'file', 'yosys_tbufmap',
92
- libdir + '/techmap/yosys/cells_tristatebuf.v',
93
- package='lambdapdk')
94
-
95
- # Defaults for OpenROAD tool variables
96
- lib.set('option', 'var', 'openroad_place_density', '0.65')
97
- lib.set('option', 'var', 'openroad_pad_global_place', '0')
98
- lib.set('option', 'var', 'openroad_pad_detail_place', '0')
99
- lib.set('option', 'var', 'openroad_macro_place_halo', ['40', '40'])
100
- lib.set('option', 'var', 'openroad_macro_place_channel', ['80', '80'])
101
-
102
- lib.set('option', 'file', 'openroad_tapcells', libdir + '/apr/openroad/tapcell.tcl',
103
- package='lambdapdk')
104
- lib.set('option', 'file', 'openroad_pdngen', libdir + '/apr/openroad/pdngen.tcl',
105
- package='lambdapdk')
106
- lib.set('option', 'file', 'openroad_global_connect',
107
- libdir + '/apr/openroad/global_connect.tcl',
108
- package='lambdapdk')
109
-
110
- lib.set('option', 'var', 'yosys_abc_clock_multiplier', "1000") # convert from ns -> ps
111
- lib.set('option', 'var', 'yosys_abc_constraint_load', "0.017pF")
112
- lib.set('option', 'var', 'yosys_driver_cell', "sg13g2_buf_4")
113
- lib.set('option', 'var', 'yosys_buffer_cell', "sg13g2_buf_4")
114
- lib.set('option', 'var', 'yosys_buffer_input', "A")
115
- lib.set('option', 'var', 'yosys_buffer_output', "X")
116
- for tool in ('yosys', 'openroad'):
117
- lib.set('option', 'var', f'{tool}_tiehigh_cell', "sg13g2_tiehi")
118
- lib.set('option', 'var', f'{tool}_tiehigh_port', "L_HI")
119
- lib.set('option', 'var', f'{tool}_tielow_cell', "sg13g2_tielo")
120
- lib.set('option', 'var', f'{tool}_tielow_port', "L_LO")
121
-
122
- # Bambu setup
123
- lib.set('option', 'var', 'bambu_clock_multiplier', "1") # convert from ns -> ns
124
-
125
- libs = [lib]
126
- for libtype in ('stdlib', 'auxlib'):
127
- lambda_lib = siliconcompiler.Library(f'lambdalib_{libtype}_{libname}',
128
- package='lambdapdk')
129
- register_data_source(lambda_lib)
130
- lambda_lib.add('option', 'ydir', libdir + f'/lambda/{libtype}')
131
- libs.append(lambda_lib)
132
-
133
- return libs
134
-
135
-
136
- #########################
137
- if __name__ == "__main__":
138
- lib = setup()
139
- lib.write_manifest(f'{lib.top()}.json')
11
+ def __init__(self, voltage):
12
+ super().__init__()
13
+ self.set_name(f"sg13g2_stdcell_{voltage}")
14
+
15
+ self.add_asic_pdk(IHP130PDK())
16
+
17
+ self.add_asic_site("CoreSite")
18
+
19
+ lib_path = Path('lambdapdk', "ihp130", 'libs', "sg13g2_stdcell")
20
+
21
+ with self.active_dataroot("ihp130"):
22
+ if voltage == "1p2V":
23
+ for corner_name, filename in [
24
+ ('slow', 'sg13g2_stdcell_slow_1p08V_125C.lib'),
25
+ ('typical', 'sg13g2_stdcell_typ_1p20V_25C.lib'),
26
+ ('fast', 'sg13g2_stdcell_fast_1p32V_m40C.lib')]:
27
+ with self.active_fileset(f"models.timing.{corner_name}.nldm"):
28
+ self.add_file(f"ihp-sg13g2/libs.ref/sg13g2_stdcell/lib/{filename}")
29
+ self.add_asic_libcornerfileset(corner_name, "nldm")
30
+ else:
31
+ for corner_name, filename in [
32
+ ('slow', 'sg13g2_stdcell_slow_1p35V_125C.lib'),
33
+ ('typical', 'sg13g2_stdcell_typ_1p50V_25C.lib'),
34
+ ('fast', 'sg13g2_stdcell_fast_1p65V_m40C.lib')]:
35
+ with self.active_fileset(f"models.timing.{corner_name}.nldm"):
36
+ self.add_file(f"ihp-sg13g2/libs.ref/sg13g2_stdcell/lib/{filename}")
37
+ self.add_asic_libcornerfileset(corner_name, "nldm")
38
+
39
+ with self.active_fileset("models.spice"):
40
+ self.add_file("ihp-sg13g2/libs.ref/sg13g2_stdcell/spice/sg13g2_stdcell.spice")
41
+
42
+ with self.active_dataroot("ihp130"):
43
+ with self.active_fileset("models.physical"):
44
+ self.add_file("ihp-sg13g2/libs.ref/sg13g2_stdcell/lef/sg13g2_stdcell.lef")
45
+ self.add_file("ihp-sg13g2/libs.ref/sg13g2_stdcell/gds/sg13g2_stdcell.gds")
46
+ self.add_asic_aprfileset()
47
+
48
+ with self.active_fileset("models.lvs"):
49
+ self.add_file("ihp-sg13g2/libs.ref/sg13g2_stdcell/cdl/sg13g2_stdcell.cdl")
50
+ self.add_asic_aprfileset()
51
+
52
+ with self.active_fileset("rtl"):
53
+ self.add_file("ihp-sg13g2/libs.ref/sg13g2_stdcell/verilog/sg13g2_stdcell.v")
54
+ self.add_asic_aprfileset()
55
+
56
+ # tie cells
57
+ self.add_asic_celllist('tie', ["sg13g2_tiehi",
58
+ "sg13g2_tielo"])
59
+
60
+ # hold cells
61
+ self.add_asic_celllist('hold', ["sg13g2_dlygate4sd1_1",
62
+ "sg13g2_dlygate4sd2_1",
63
+ "sg13g2_dlygate4sd3_1"])
64
+
65
+ # filler
66
+ self.add_asic_celllist('filler', ["sg13g2_fill_1",
67
+ "sg13g2_fill_2",
68
+ "sg13g2_fill_4",
69
+ "sg13g2_fill_8"])
70
+
71
+ # decap
72
+ self.add_asic_celllist('decap', ["sg13g2_decap_4",
73
+ "sg13g2_decap_8"])
74
+
75
+ # antenna
76
+ self.add_asic_celllist('antenna', ["sg13g2_antennanp"])
77
+
78
+ # Dont use
79
+ self.add_asic_celllist('dontuse', ["sg13g2_lgcp_1",
80
+ "sg13g2_sighold",
81
+ "sg13g2_slgcp_1",
82
+ "sg13g2_dfrbp_2"])
83
+
84
+ # Setup for yosys
85
+ with self.active_dataroot("lambdapdk"):
86
+ self.set_yosys_driver_cell("sg13g2_buf_4")
87
+ self.set_yosys_buffer_cell("sg13g2_buf_4", "A", "X")
88
+ self.set_yosys_tielow_cell("sg13g2_tielo", "L_LO")
89
+ self.set_yosys_tiehigh_cell("sg13g2_tiehi", "L_HI")
90
+ self.set_yosys_abc(1000, 17)
91
+ self.set_yosys_tristatebuffer_map(
92
+ lib_path / "techmap" / "yosys" / "cells_tristatebuf.v")
93
+ self.add_yosys_tech_map(lib_path / "techmap" / "yosys" / "cells_latch.v")
94
+
95
+ # Setup for OpenROAD
96
+ with self.active_dataroot("lambdapdk"):
97
+ self.set_openroad_placement_density(0.65)
98
+ self.set_openroad_tielow_cell("sg13g2_tielo", "L_LO")
99
+ self.set_openroad_tiehigh_cell("sg13g2_tiehi", "L_HI")
100
+ self.set_openroad_macro_placement_halo(40, 40)
101
+ self.set_openroad_tapcells_file(lib_path / "apr" / "openroad" / "tapcell.tcl")
102
+ self.add_openroad_global_connect_file(
103
+ lib_path / "apr" / "openroad" / "global_connect.tcl")
104
+ self.add_openroad_power_grid_file(lib_path / "apr" / "openroad" / "pdngen.tcl")
105
+
106
+ # Setup for bambu
107
+ self.set_bambu_clock_multiplier(1)
108
+
109
+
110
+ class IHP130StdCell_1p2(_IHP130StdCell):
111
+ def __init__(self):
112
+ super().__init__("1p2")
113
+
114
+
115
+ class IHP130StdCell_1p5(_IHP130StdCell):
116
+ def __init__(self):
117
+ super().__init__("1p5")
@@ -1,18 +1,9 @@
1
- import os
2
- import siliconcompiler
3
- from lambdapdk import register_data_source
1
+ from pathlib import Path
4
2
 
3
+ from lambdapdk import LambdaPDK
5
4
 
6
- stackups = []
7
- for m in ("3ML", "4ML", "5ML"):
8
- for w in ("0400", "0800", "2000", "0400_2000"):
9
- stackups.append(f'{m}_{w}')
10
5
 
11
-
12
- ####################################################
13
- # PDK Setup
14
- ####################################################
15
- def setup():
6
+ class _Interposer(LambdaPDK):
16
7
  '''
17
8
  The interposer PDK is a passive technology with a number of
18
9
  simulated stackups. The PDK contains enablement for place and
@@ -20,60 +11,37 @@ def setup():
20
11
  Note that this process design kit is provided as an academic
21
12
  and research aid only and the resulting designs are not manufacturable.
22
13
  '''
14
+ def __init__(self, stackup):
15
+ super().__init__()
16
+ self.set_name(f"interposer_{stackup}")
23
17
 
24
- foundry = 'virtual'
25
- process = 'interposer'
26
-
27
- libtype = 'none'
28
-
29
- node = 130
30
- # TODO: dummy numbers, only matter for cost estimation
31
- wafersize = 300
32
- hscribe = 0.1
33
- vscribe = 0.1
34
- edgemargin = 2
35
-
36
- pdkdir = os.path.join('lambdapdk', 'interposer', 'base')
18
+ self.set_foundry("virtual")
19
+ self.set_version("v0.0.1")
20
+ self.set_stackup(stackup)
37
21
 
38
- pdk = siliconcompiler.PDK(process, package='lambdapdk')
39
- register_data_source(pdk)
22
+ pdk_path = Path("lambdapdk", "interposer", "base")
40
23
 
41
- # process name
42
- pdk.set('pdk', process, 'foundry', foundry)
43
- pdk.set('pdk', process, 'node', node)
44
- pdk.set('pdk', process, 'version', 'v0.0.1')
45
- pdk.set('pdk', process, 'stackup', stackups)
46
- pdk.set('pdk', process, 'wafersize', wafersize)
47
- pdk.set('pdk', process, 'edgemargin', edgemargin)
48
- pdk.set('pdk', process, 'scribe', (hscribe, vscribe))
24
+ with self.active_dataroot("lambdapdk"):
25
+ # APR Setup
26
+ with self.active_fileset("views.lef"):
27
+ self.add_file(pdk_path / "apr" / f"{stackup}.lef")
28
+ for tool in ('openroad', 'klayout', 'magic'):
29
+ self.add_aprtechfileset(tool)
49
30
 
50
- # APR Setup
51
- for stackup in stackups:
52
- for tool in ('openroad', 'klayout', 'magic'):
53
- pdk.set('pdk', process, 'aprtech', tool, stackup, libtype, 'lef',
54
- pdkdir + f'/apr/{stackup}.lef')
31
+ with self.active_fileset("layermap"):
32
+ self.add_file(pdk_path / "apr" / f"{stackup}.layermap", filetype="layermap")
55
33
 
56
- pdk.set('pdk', process, 'minlayer', stackup, 'metal1')
57
- pdk.set('pdk', process, 'maxlayer', stackup, 'topmetal')
34
+ self.set_aprroutinglayers(min="metal1", max="topmetal")
58
35
 
59
- # DRC Runsets
60
- pdk.set('pdk', process, 'drc', 'runset', 'klayout', stackup, 'drc',
61
- pdkdir + f'/setup/klayout/{stackup}.drc')
36
+ # KLayout Setup
37
+ with self.active_dataroot("lambdapdk"):
38
+ # Klayout setup file
39
+ with self.active_fileset("klayout.techmap"):
40
+ self.add_file(pdk_path / "setup" / "klayout" / f"{stackup}.lyp", filetype="display")
41
+ self.add_displayfileset("klayout")
42
+ self.add_layermapfileset("klayout", "def", "gds", fileset="layermap")
62
43
 
63
- key = 'drc_params:drc'
64
- pdk.add('pdk', process, 'var', 'klayout', stackup, key, 'input=<input>')
65
- pdk.add('pdk', process, 'var', 'klayout', stackup, key, 'topcell=<topcell>')
66
- pdk.add('pdk', process, 'var', 'klayout', stackup, key, 'report=<report>')
67
- pdk.add('pdk', process, 'var', 'klayout', stackup, key, 'threads=<threads>')
68
-
69
- # Layer map and display file
70
- pdk.set('pdk', process, 'layermap', 'klayout', 'def', 'gds', stackup,
71
- pdkdir + f'/apr/{stackup}.layermap')
72
- pdk.set('pdk', process, 'display', 'klayout', stackup,
73
- pdkdir + f'/setup/klayout/{stackup}.lyp')
74
-
75
- pdk.set('pdk', process, 'aprtech', 'openroad', stackup, libtype, 'fill',
76
- pdkdir + f'/dfm/openroad/{stackup}.fill.json')
44
+ # OpenROAD Setup
77
45
 
78
46
  # Openroad global routing grid derating
79
47
  openroad_layer_adjustments = {
@@ -88,24 +56,92 @@ def setup():
88
56
  for layer, adj in openroad_layer_adjustments.items():
89
57
  if layer != 'topmetal' and int(layer[-1]) >= int(stackup[0]):
90
58
  continue
91
- pdk.set('pdk', process, 'var', 'openroad', f'{layer}_adjustment', stackup, adj)
59
+ self.set_openroad_globalroutingderating(layer, adj)
60
+
61
+ self.set_openroad_rclayers(signal="metal2", clock="metal2")
62
+ self.add_openroad_pinlayers(vertical="metal2", horizontal="metal3")
63
+
64
+ with self.active_dataroot("lambdapdk"):
65
+ with self.active_fileset("openroad.fill"):
66
+ self.add_file(pdk_path / "dfm" / "openroad" / f"{stackup}.fill.json",
67
+ filetype="fill")
68
+ self.add_aprtechfileset("openroad")
69
+
70
+ # PEX
71
+ for corner in ["minimum", "typical", "maximum"]:
72
+ with self.active_fileset(f"openroad.pex.{corner}"):
73
+ self.add_file(pdk_path / "pex" / "openroad" / f"{stackup}.{corner}.tcl",
74
+ filetype="tcl")
75
+
76
+ self.add_pexmodelfileset("openroad", corner)
77
+
78
+ # DRC
79
+ with self.active_dataroot("lambdapdk"):
80
+ with self.active_fileset("klayout.drc"):
81
+ self.add_file(pdk_path / "setup" / "klayout" / f"{stackup}.drc", filetype="drc")
82
+ self.add_runsetfileset("drc", "klayout", "drc")
83
+
84
+ self.add_klayout_drcparam("drc", "input=<input>")
85
+ self.add_klayout_drcparam("drc", "topcell=<topcell>")
86
+ self.add_klayout_drcparam("drc", "report=<report>")
87
+ self.add_klayout_drcparam("drc", "threads=<threads>")
88
+
89
+
90
+ class Interposer_3ML_0400(_Interposer):
91
+ def __init__(self):
92
+ super().__init__("3ML_0400")
93
+
94
+
95
+ class Interposer_3ML_0800(_Interposer):
96
+ def __init__(self):
97
+ super().__init__("3ML_0800")
98
+
99
+
100
+ class Interposer_3ML_2000(_Interposer):
101
+ def __init__(self):
102
+ super().__init__("3ML_2000")
103
+
104
+
105
+ class Interposer_3ML_0400_2000(_Interposer):
106
+ def __init__(self):
107
+ super().__init__("3ML_0400_2000")
108
+
109
+
110
+ class Interposer_4ML_0400(_Interposer):
111
+ def __init__(self):
112
+ super().__init__("4ML_0400")
113
+
114
+
115
+ class Interposer_4ML_0800(_Interposer):
116
+ def __init__(self):
117
+ super().__init__("4ML_0800")
118
+
119
+
120
+ class Interposer_4ML_2000(_Interposer):
121
+ def __init__(self):
122
+ super().__init__("4ML_2000")
123
+
124
+
125
+ class Interposer_4ML_0400_2000(_Interposer):
126
+ def __init__(self):
127
+ super().__init__("4ML_0400_2000")
128
+
129
+
130
+ class Interposer_5ML_0400(_Interposer):
131
+ def __init__(self):
132
+ super().__init__("5ML_0400")
92
133
 
93
- pdk.set('pdk', process, 'var', 'openroad', 'rclayer_signal', stackup, 'metal2')
94
- pdk.set('pdk', process, 'var', 'openroad', 'rclayer_clock', stackup, 'metal2')
95
134
 
96
- pdk.set('pdk', process, 'var', 'openroad', 'pin_layer_vertical', stackup, 'metal2')
97
- pdk.set('pdk', process, 'var', 'openroad', 'pin_layer_horizontal', stackup, 'metal3')
135
+ class Interposer_5ML_0800(_Interposer):
136
+ def __init__(self):
137
+ super().__init__("5ML_0800")
98
138
 
99
- # PEX
100
- for corner in ["minimum", "typical", "maximum"]:
101
- pdk.set('pdk', process, 'pexmodel', 'openroad', stackup, corner,
102
- pdkdir + '/pex/openroad/' + stackup + '.' + corner + '.tcl')
103
139
 
104
- return pdk
140
+ class Interposer_5ML_2000(_Interposer):
141
+ def __init__(self):
142
+ super().__init__("5ML_2000")
105
143
 
106
144
 
107
- #########################
108
- if __name__ == "__main__":
109
- pdk = setup()
110
- pdk.write_manifest(f'{pdk.top()}.json')
111
- pdk.check_filepaths()
145
+ class Interposer_5ML_0400_2000(_Interposer):
146
+ def __init__(self):
147
+ super().__init__("5ML_0400_2000")
@@ -1,31 +1,46 @@
1
- import os
2
- import siliconcompiler
3
- from lambdapdk import register_data_source
4
- from lambdapdk.interposer import stackups
1
+ from pathlib import Path
5
2
 
3
+ from lambdapdk import LambdaLibrary
6
4
 
7
- def setup():
5
+ from lambdapdk.interposer import Interposer_3ML_0400, \
6
+ Interposer_3ML_0800, \
7
+ Interposer_3ML_2000, \
8
+ Interposer_3ML_0400_2000, \
9
+ Interposer_4ML_0400, \
10
+ Interposer_4ML_0800, \
11
+ Interposer_4ML_2000, \
12
+ Interposer_4ML_0400_2000, \
13
+ Interposer_5ML_0400, \
14
+ Interposer_5ML_0800, \
15
+ Interposer_5ML_2000, \
16
+ Interposer_5ML_0400_2000
17
+
18
+
19
+ class BumpLibrary(LambdaLibrary):
8
20
  '''
9
21
  Interposer bump library
10
22
  '''
11
- libdir = "lambdapdk/interposer/libs/bumps/"
12
-
13
- lib = siliconcompiler.Library('interposer_bumps', package='lambdapdk')
14
- register_data_source(lib)
15
-
16
- # pdk
17
- lib.set('option', 'pdk', 'interposer')
18
-
19
- for stackup in stackups:
20
- lib.set('output', stackup, 'lef',
21
- os.path.join(libdir, 'lef/bumps.lef'))
22
- lib.add('output', stackup, 'gds',
23
- os.path.join(libdir, 'gds/bumps.gds'))
24
-
25
- return lib
26
-
27
-
28
- #########################
29
- if __name__ == "__main__":
30
- lib = setup(siliconcompiler.Chip('<lib>'))
31
- lib.write_manifest(f'{lib.top()}.json')
23
+ def __init__(self):
24
+ super().__init__()
25
+ self.set_name("interposer_bumps")
26
+
27
+ path_base = Path("lambdapdk", "interposer", "libs", 'bumps')
28
+
29
+ self.add_asic_pdk(Interposer_3ML_0400(), default=False)
30
+ self.add_asic_pdk(Interposer_3ML_0800(), default=False)
31
+ self.add_asic_pdk(Interposer_3ML_2000(), default=False)
32
+ self.add_asic_pdk(Interposer_3ML_0400_2000(), default=False)
33
+ self.add_asic_pdk(Interposer_4ML_0400(), default=False)
34
+ self.add_asic_pdk(Interposer_4ML_0800(), default=False)
35
+ self.add_asic_pdk(Interposer_4ML_2000(), default=False)
36
+ self.add_asic_pdk(Interposer_4ML_0400_2000(), default=False)
37
+ self.add_asic_pdk(Interposer_5ML_0400(), default=False)
38
+ self.add_asic_pdk(Interposer_5ML_0800(), default=False)
39
+ self.add_asic_pdk(Interposer_5ML_2000(), default=False)
40
+ self.add_asic_pdk(Interposer_5ML_0400_2000(), default=False)
41
+
42
+ with self.active_dataroot("lambdapdk"):
43
+ with self.active_fileset("models.physical"):
44
+ self.add_file(path_base / "lef" / "bumps.lef")
45
+ self.add_file(path_base / "gds" / "bumps.gds")
46
+ self.add_asic_aprfileset()