siliconcompiler 0.34.2__py3-none-any.whl → 0.34.3__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.
- siliconcompiler/__init__.py +12 -5
- siliconcompiler/__main__.py +1 -7
- siliconcompiler/_metadata.py +1 -1
- siliconcompiler/apps/_common.py +104 -23
- siliconcompiler/apps/sc.py +4 -8
- siliconcompiler/apps/sc_dashboard.py +6 -4
- siliconcompiler/apps/sc_install.py +10 -6
- siliconcompiler/apps/sc_issue.py +7 -5
- siliconcompiler/apps/sc_remote.py +1 -1
- siliconcompiler/apps/sc_server.py +9 -14
- siliconcompiler/apps/sc_show.py +6 -5
- siliconcompiler/apps/smake.py +130 -94
- siliconcompiler/apps/utils/replay.py +4 -7
- siliconcompiler/apps/utils/summarize.py +3 -5
- siliconcompiler/asic.py +420 -0
- siliconcompiler/checklist.py +25 -2
- siliconcompiler/cmdlineschema.py +534 -0
- siliconcompiler/constraints/asic_component.py +2 -2
- siliconcompiler/constraints/asic_pins.py +2 -2
- siliconcompiler/constraints/asic_timing.py +3 -3
- siliconcompiler/core.py +7 -32
- siliconcompiler/data/templates/tcl/manifest.tcl.j2 +8 -0
- siliconcompiler/dependencyschema.py +89 -31
- siliconcompiler/design.py +176 -207
- siliconcompiler/filesetschema.py +250 -0
- siliconcompiler/flowgraph.py +274 -95
- siliconcompiler/fpga.py +124 -1
- siliconcompiler/library.py +218 -20
- siliconcompiler/metric.py +233 -20
- siliconcompiler/package/__init__.py +271 -50
- siliconcompiler/package/git.py +92 -16
- siliconcompiler/package/github.py +108 -12
- siliconcompiler/package/https.py +79 -16
- siliconcompiler/packageschema.py +88 -7
- siliconcompiler/pathschema.py +31 -2
- siliconcompiler/pdk.py +566 -1
- siliconcompiler/project.py +1095 -94
- siliconcompiler/record.py +38 -1
- siliconcompiler/remote/__init__.py +5 -2
- siliconcompiler/remote/client.py +11 -6
- siliconcompiler/remote/schema.py +5 -23
- siliconcompiler/remote/server.py +41 -54
- siliconcompiler/report/__init__.py +3 -3
- siliconcompiler/report/dashboard/__init__.py +48 -14
- siliconcompiler/report/dashboard/cli/__init__.py +99 -21
- siliconcompiler/report/dashboard/cli/board.py +364 -179
- siliconcompiler/report/dashboard/web/__init__.py +90 -12
- siliconcompiler/report/dashboard/web/components/__init__.py +219 -240
- siliconcompiler/report/dashboard/web/components/flowgraph.py +49 -26
- siliconcompiler/report/dashboard/web/components/graph.py +139 -100
- siliconcompiler/report/dashboard/web/layouts/__init__.py +29 -1
- siliconcompiler/report/dashboard/web/layouts/_common.py +38 -2
- siliconcompiler/report/dashboard/web/layouts/vertical_flowgraph.py +39 -26
- siliconcompiler/report/dashboard/web/layouts/vertical_flowgraph_node_tab.py +50 -50
- siliconcompiler/report/dashboard/web/layouts/vertical_flowgraph_sac_tabs.py +49 -46
- siliconcompiler/report/dashboard/web/state.py +141 -14
- siliconcompiler/report/dashboard/web/utils/__init__.py +79 -16
- siliconcompiler/report/dashboard/web/utils/file_utils.py +74 -11
- siliconcompiler/report/dashboard/web/viewer.py +25 -1
- siliconcompiler/report/report.py +5 -2
- siliconcompiler/report/summary_image.py +29 -11
- siliconcompiler/scheduler/__init__.py +9 -1
- siliconcompiler/scheduler/docker.py +79 -1
- siliconcompiler/scheduler/run_node.py +35 -19
- siliconcompiler/scheduler/scheduler.py +208 -24
- siliconcompiler/scheduler/schedulernode.py +372 -46
- siliconcompiler/scheduler/send_messages.py +77 -29
- siliconcompiler/scheduler/slurm.py +76 -12
- siliconcompiler/scheduler/taskscheduler.py +140 -20
- siliconcompiler/schema/__init__.py +0 -2
- siliconcompiler/schema/baseschema.py +194 -38
- siliconcompiler/schema/journal.py +7 -4
- siliconcompiler/schema/namedschema.py +16 -10
- siliconcompiler/schema/parameter.py +55 -9
- siliconcompiler/schema/parametervalue.py +60 -0
- siliconcompiler/schema/safeschema.py +25 -2
- siliconcompiler/schema/schema_cfg.py +5 -5
- siliconcompiler/schema/utils.py +2 -2
- siliconcompiler/schema_obj.py +20 -3
- siliconcompiler/tool.py +979 -302
- siliconcompiler/tools/bambu/__init__.py +41 -0
- siliconcompiler/tools/builtin/concatenate.py +2 -2
- siliconcompiler/tools/builtin/minimum.py +2 -1
- siliconcompiler/tools/builtin/mux.py +2 -1
- siliconcompiler/tools/builtin/nop.py +2 -1
- siliconcompiler/tools/builtin/verify.py +2 -1
- siliconcompiler/tools/klayout/__init__.py +95 -0
- siliconcompiler/tools/openroad/__init__.py +289 -0
- siliconcompiler/tools/openroad/scripts/apr/preamble.tcl +3 -0
- siliconcompiler/tools/openroad/scripts/apr/sc_detailed_route.tcl +7 -2
- siliconcompiler/tools/openroad/scripts/apr/sc_global_route.tcl +8 -4
- siliconcompiler/tools/openroad/scripts/apr/sc_init_floorplan.tcl +9 -5
- siliconcompiler/tools/openroad/scripts/common/write_images.tcl +5 -1
- siliconcompiler/tools/slang/__init__.py +1 -1
- siliconcompiler/tools/slang/elaborate.py +2 -1
- siliconcompiler/tools/vivado/scripts/sc_run.tcl +1 -1
- siliconcompiler/tools/vivado/scripts/sc_syn_fpga.tcl +8 -1
- siliconcompiler/tools/vivado/syn_fpga.py +6 -0
- siliconcompiler/tools/vivado/vivado.py +35 -2
- siliconcompiler/tools/vpr/__init__.py +150 -0
- siliconcompiler/tools/yosys/__init__.py +369 -1
- siliconcompiler/tools/yosys/scripts/procs.tcl +0 -1
- siliconcompiler/toolscripts/_tools.json +5 -10
- siliconcompiler/utils/__init__.py +66 -0
- siliconcompiler/utils/flowgraph.py +2 -2
- siliconcompiler/utils/issue.py +2 -1
- siliconcompiler/utils/logging.py +14 -0
- siliconcompiler/utils/multiprocessing.py +256 -0
- siliconcompiler/utils/showtools.py +10 -0
- {siliconcompiler-0.34.2.dist-info → siliconcompiler-0.34.3.dist-info}/METADATA +5 -5
- {siliconcompiler-0.34.2.dist-info → siliconcompiler-0.34.3.dist-info}/RECORD +115 -118
- {siliconcompiler-0.34.2.dist-info → siliconcompiler-0.34.3.dist-info}/entry_points.txt +3 -0
- siliconcompiler/schema/cmdlineschema.py +0 -250
- siliconcompiler/toolscripts/rhel8/install-slang.sh +0 -40
- siliconcompiler/toolscripts/rhel9/install-slang.sh +0 -40
- siliconcompiler/toolscripts/ubuntu20/install-slang.sh +0 -47
- siliconcompiler/toolscripts/ubuntu22/install-slang.sh +0 -37
- siliconcompiler/toolscripts/ubuntu24/install-slang.sh +0 -37
- {siliconcompiler-0.34.2.dist-info → siliconcompiler-0.34.3.dist-info}/WHEEL +0 -0
- {siliconcompiler-0.34.2.dist-info → siliconcompiler-0.34.3.dist-info}/licenses/LICENSE +0 -0
- {siliconcompiler-0.34.2.dist-info → siliconcompiler-0.34.3.dist-info}/top_level.txt +0 -0
siliconcompiler/fpga.py
CHANGED
|
@@ -1,19 +1,142 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Schema definitions for FPGA-related configurations in SiliconCompiler.
|
|
3
|
+
|
|
4
|
+
This module defines classes and functions for managing FPGA-specific
|
|
5
|
+
parameters, such as part names, LUT sizes, and vendor information,
|
|
6
|
+
within the SiliconCompiler schema. It includes schemas for both
|
|
7
|
+
tool-library and temporary configurations.
|
|
8
|
+
"""
|
|
9
|
+
|
|
1
10
|
from siliconcompiler.schema import BaseSchema
|
|
2
11
|
from siliconcompiler.schema import EditableSchema, Parameter, Scope
|
|
3
12
|
from siliconcompiler.schema.utils import trim
|
|
4
13
|
|
|
14
|
+
from siliconcompiler import ToolLibrarySchema
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class FPGASchema(ToolLibrarySchema):
|
|
18
|
+
"""
|
|
19
|
+
A schema for configuring FPGA-related parameters.
|
|
20
|
+
|
|
21
|
+
This class extends ToolLibrarySchema to provide a structured way
|
|
22
|
+
to define and access FPGA-specific settings like part name and LUT size.
|
|
23
|
+
"""
|
|
24
|
+
def __init__(self, name: str = None):
|
|
25
|
+
"""
|
|
26
|
+
Initializes the FPGASchema.
|
|
27
|
+
|
|
28
|
+
Args:
|
|
29
|
+
name (str, optional): The name of the schema. Defaults to None.
|
|
30
|
+
"""
|
|
31
|
+
super().__init__()
|
|
32
|
+
self.set_name(name)
|
|
33
|
+
|
|
34
|
+
schema = EditableSchema(self)
|
|
35
|
+
schema.insert(
|
|
36
|
+
"fpga", 'partname',
|
|
37
|
+
Parameter(
|
|
38
|
+
'str',
|
|
39
|
+
scope=Scope.GLOBAL,
|
|
40
|
+
shorthelp="FPGA: part name",
|
|
41
|
+
switch="-fpga_partname <str>",
|
|
42
|
+
example=["cli: -fpga_partname fpga64k",
|
|
43
|
+
"api: chip.set('fpga', 'partname', 'fpga64k')"],
|
|
44
|
+
help=trim("""
|
|
45
|
+
Complete part name used as a device target by the FPGA compilation
|
|
46
|
+
tool. The part name must be an exact string match to the partname
|
|
47
|
+
hard coded within the FPGA EDA tool.""")))
|
|
48
|
+
|
|
49
|
+
schema.insert(
|
|
50
|
+
"fpga", 'lutsize',
|
|
51
|
+
Parameter(
|
|
52
|
+
'int',
|
|
53
|
+
scope=Scope.GLOBAL,
|
|
54
|
+
shorthelp="FPGA: lutsize",
|
|
55
|
+
switch="-fpga_lutsize 'partname <int>'",
|
|
56
|
+
example=["cli: -fpga_lutsize 'fpga64k 4'",
|
|
57
|
+
"api: chip.set('fpga', 'fpga64k', 'lutsize', '4')"],
|
|
58
|
+
help=trim("""
|
|
59
|
+
Specify the number of inputs in each lookup table (LUT) for the
|
|
60
|
+
FPGA partname. For architectures with fracturable LUTs, this is
|
|
61
|
+
the number of inputs of the unfractured LUT.""")))
|
|
62
|
+
|
|
63
|
+
def set_partname(self, name: str):
|
|
64
|
+
"""
|
|
65
|
+
Sets the FPGA part name.
|
|
66
|
+
|
|
67
|
+
Args:
|
|
68
|
+
name (str): The name of the FPGA part.
|
|
69
|
+
|
|
70
|
+
Returns:
|
|
71
|
+
Any: The result of the `set` operation.
|
|
72
|
+
"""
|
|
73
|
+
return self.set("fpga", "partname", name)
|
|
74
|
+
|
|
75
|
+
def set_lutsize(self, lut: int):
|
|
76
|
+
"""
|
|
77
|
+
Sets the LUT size for the FPGA.
|
|
5
78
|
|
|
6
|
-
|
|
79
|
+
Args:
|
|
80
|
+
lut (int): The number of inputs for the lookup table.
|
|
81
|
+
|
|
82
|
+
Returns:
|
|
83
|
+
Any: The result of the `set` operation.
|
|
84
|
+
"""
|
|
85
|
+
return self.set("fpga", "lutsize", lut)
|
|
86
|
+
|
|
87
|
+
@classmethod
|
|
88
|
+
def _getdict_type(cls) -> str:
|
|
89
|
+
"""
|
|
90
|
+
Returns the meta data for getdict.
|
|
91
|
+
|
|
92
|
+
Returns:
|
|
93
|
+
str: The name of the class.
|
|
94
|
+
"""
|
|
95
|
+
|
|
96
|
+
return FPGASchema.__name__
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
class FPGASchemaTmp(BaseSchema):
|
|
100
|
+
"""
|
|
101
|
+
A temporary schema for FPGA configurations.
|
|
102
|
+
|
|
103
|
+
This class is used for temporary storage of FPGA-related settings.
|
|
104
|
+
It extends BaseSchema and uses the `schema_fpga` function to populate
|
|
105
|
+
its fields.
|
|
106
|
+
"""
|
|
7
107
|
def __init__(self):
|
|
108
|
+
"""
|
|
109
|
+
Initializes the FPGASchemaTmp.
|
|
110
|
+
"""
|
|
8
111
|
super().__init__()
|
|
9
112
|
|
|
10
113
|
schema_fpga(self)
|
|
11
114
|
|
|
115
|
+
@classmethod
|
|
116
|
+
def _getdict_type(cls) -> str:
|
|
117
|
+
"""
|
|
118
|
+
Returns the meta data for getdict.
|
|
119
|
+
|
|
120
|
+
Returns:
|
|
121
|
+
str: The name of the class.
|
|
122
|
+
"""
|
|
123
|
+
|
|
124
|
+
return FPGASchemaTmp.__name__
|
|
125
|
+
|
|
12
126
|
|
|
13
127
|
###############################################################################
|
|
14
128
|
# FPGA
|
|
15
129
|
###############################################################################
|
|
16
130
|
def schema_fpga(schema):
|
|
131
|
+
"""
|
|
132
|
+
Adds FPGA-related parameters to a given schema.
|
|
133
|
+
|
|
134
|
+
This function defines and inserts various FPGA configuration parameters
|
|
135
|
+
into the provided schema object.
|
|
136
|
+
|
|
137
|
+
Args:
|
|
138
|
+
schema: The schema object to which the parameters will be added.
|
|
139
|
+
"""
|
|
17
140
|
schema = EditableSchema(schema)
|
|
18
141
|
|
|
19
142
|
partname = 'default'
|
siliconcompiler/library.py
CHANGED
|
@@ -1,20 +1,46 @@
|
|
|
1
1
|
from typing import final, Union, List
|
|
2
2
|
|
|
3
|
-
from siliconcompiler
|
|
3
|
+
from siliconcompiler import PackageSchema
|
|
4
|
+
|
|
5
|
+
from siliconcompiler.dependencyschema import DependencySchema
|
|
6
|
+
from siliconcompiler.filesetschema import FileSetSchema
|
|
7
|
+
from siliconcompiler.schema import NamedSchema
|
|
4
8
|
|
|
5
9
|
from siliconcompiler.schema import EditableSchema, Parameter, Scope, PerNode
|
|
6
10
|
from siliconcompiler.schema.utils import trim
|
|
7
11
|
|
|
8
12
|
|
|
9
|
-
class LibrarySchema(
|
|
13
|
+
class LibrarySchema(FileSetSchema, PackageSchema, NamedSchema):
|
|
14
|
+
"""
|
|
15
|
+
A class for managing library schemas.
|
|
16
|
+
"""
|
|
10
17
|
def __init__(self, name: str = None):
|
|
18
|
+
"""
|
|
19
|
+
Initializes a LibrarySchema object.
|
|
20
|
+
|
|
21
|
+
Args:
|
|
22
|
+
name (str, optional): The name of the library. Defaults to None.
|
|
23
|
+
"""
|
|
11
24
|
super().__init__()
|
|
12
25
|
self.set_name(name)
|
|
13
26
|
|
|
27
|
+
@classmethod
|
|
28
|
+
def _getdict_type(cls) -> str:
|
|
29
|
+
"""
|
|
30
|
+
Returns the meta data for getdict.
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
return LibrarySchema.__name__
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class ToolLibrarySchema(LibrarySchema):
|
|
37
|
+
"""
|
|
38
|
+
A class for managing tool-related library schemas.
|
|
39
|
+
"""
|
|
14
40
|
@final
|
|
15
41
|
def define_tool_parameter(self, tool: str, name: str, type: str, help: str, **kwargs):
|
|
16
42
|
"""
|
|
17
|
-
Define a new tool parameter for the library
|
|
43
|
+
Define a new tool parameter for the library.
|
|
18
44
|
|
|
19
45
|
Args:
|
|
20
46
|
tool (str): name of the tool
|
|
@@ -40,22 +66,118 @@ class LibrarySchema(DesignSchema):
|
|
|
40
66
|
Parameter(type, **kwargs)
|
|
41
67
|
)
|
|
42
68
|
|
|
69
|
+
@classmethod
|
|
70
|
+
def _getdict_type(cls) -> str:
|
|
71
|
+
"""
|
|
72
|
+
Returns the meta data for getdict.
|
|
73
|
+
"""
|
|
74
|
+
|
|
75
|
+
return ToolLibrarySchema.__name__
|
|
76
|
+
|
|
77
|
+
def _from_dict(self, manifest, keypath, version=None):
|
|
78
|
+
"""
|
|
79
|
+
Constructs a schema from a dictionary.
|
|
80
|
+
|
|
81
|
+
Args:
|
|
82
|
+
manifest (dict): Dictionary to construct from.
|
|
83
|
+
keypath (list): List of keys representing the path to the current dictionary.
|
|
84
|
+
version (str, optional): Version of the manifest. Defaults to None.
|
|
85
|
+
|
|
86
|
+
Returns:
|
|
87
|
+
dict: The constructed dictionary.
|
|
88
|
+
"""
|
|
89
|
+
if "tool" in manifest:
|
|
90
|
+
# collect tool keys
|
|
91
|
+
tool_keys = self.allkeys("tool")
|
|
92
|
+
|
|
93
|
+
# collect manifest
|
|
94
|
+
manifest_keys = set()
|
|
95
|
+
for tool, tool_var in manifest["tool"].items():
|
|
96
|
+
for var in tool_var:
|
|
97
|
+
manifest_keys.add((tool, var))
|
|
98
|
+
|
|
99
|
+
edit = EditableSchema(self)
|
|
100
|
+
for tool, var in sorted(manifest_keys.difference(tool_keys)):
|
|
101
|
+
edit.insert("tool", tool, var,
|
|
102
|
+
Parameter.from_dict(
|
|
103
|
+
manifest["tool"][tool][var],
|
|
104
|
+
keypath=keypath + [tool, var],
|
|
105
|
+
version=version))
|
|
106
|
+
del manifest["tool"][tool][var]
|
|
107
|
+
if not manifest["tool"][tool]:
|
|
108
|
+
del manifest["tool"][tool]
|
|
109
|
+
|
|
110
|
+
if not manifest["tool"]:
|
|
111
|
+
del manifest["tool"]
|
|
43
112
|
|
|
44
|
-
|
|
113
|
+
return super()._from_dict(manifest, keypath, version)
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
class StdCellLibrarySchema(ToolLibrarySchema, DependencySchema):
|
|
117
|
+
"""
|
|
118
|
+
A class for managing standard cell library schemas.
|
|
119
|
+
"""
|
|
45
120
|
def __init__(self, name: str = None):
|
|
121
|
+
"""
|
|
122
|
+
Initializes a StdCellLibrarySchema object.
|
|
123
|
+
|
|
124
|
+
Args:
|
|
125
|
+
name (str, optional): The name of the standard cell library. Defaults to None.
|
|
126
|
+
"""
|
|
46
127
|
super().__init__()
|
|
47
128
|
self.set_name(name)
|
|
48
129
|
|
|
49
130
|
schema = EditableSchema(self)
|
|
50
131
|
|
|
51
132
|
schema.insert(
|
|
52
|
-
|
|
133
|
+
"asic", "pdk",
|
|
53
134
|
Parameter(
|
|
54
|
-
|
|
135
|
+
"str",
|
|
136
|
+
scope=Scope.GLOBAL,
|
|
137
|
+
shorthelp="ASIC: ",
|
|
138
|
+
example=[
|
|
139
|
+
"api: schema.set('asic', 'libcornerfileset', 'slow', 'nldm', 'timing.slow')"],
|
|
140
|
+
help=trim("""""")))
|
|
141
|
+
|
|
142
|
+
schema.insert(
|
|
143
|
+
"asic", "stackup",
|
|
144
|
+
Parameter(
|
|
145
|
+
"{str}",
|
|
146
|
+
scope=Scope.GLOBAL,
|
|
147
|
+
shorthelp="ASIC: ",
|
|
148
|
+
example=[
|
|
149
|
+
"api: schema.set('asic', 'libcornerfileset', 'slow', 'nldm', 'timing.slow')"],
|
|
150
|
+
help=trim("""Set of supported stackups""")))
|
|
151
|
+
|
|
152
|
+
schema.insert(
|
|
153
|
+
'asic', 'libcornerfileset', 'default', 'default',
|
|
154
|
+
Parameter(
|
|
155
|
+
'{str}',
|
|
156
|
+
scope=Scope.GLOBAL,
|
|
157
|
+
shorthelp="ASIC: map of filesets to timing corners",
|
|
158
|
+
example=[
|
|
159
|
+
"api: schema.set('asic', 'libcornerfileset', 'slow', 'nldm', 'timing.slow')"],
|
|
160
|
+
help=trim("""Map between filesets and timing corners.""")))
|
|
161
|
+
|
|
162
|
+
schema.insert(
|
|
163
|
+
'asic', 'pexcornerfileset', 'default',
|
|
164
|
+
Parameter(
|
|
165
|
+
'{str}',
|
|
166
|
+
scope=Scope.GLOBAL,
|
|
167
|
+
shorthelp="ASIC: map of filesets to pex corners",
|
|
168
|
+
example=[
|
|
169
|
+
"api: schema.set('asic', 'pexcornerfileset', 'slow', 'timing.slow')"],
|
|
170
|
+
help=trim("""Map between filesets and pex corners.""")))
|
|
171
|
+
|
|
172
|
+
schema.insert(
|
|
173
|
+
'asic', 'aprfileset',
|
|
174
|
+
Parameter(
|
|
175
|
+
'{str}',
|
|
55
176
|
scope=Scope.GLOBAL,
|
|
56
|
-
shorthelp="ASIC: map of filesets to
|
|
57
|
-
example=[
|
|
58
|
-
|
|
177
|
+
shorthelp="ASIC: map of filesets to APR files",
|
|
178
|
+
example=[
|
|
179
|
+
"api: schema.set('asic', 'aprfileset', 'model.lef')"],
|
|
180
|
+
help=trim("""Map between filesets and automated place and route tool files.""")))
|
|
59
181
|
|
|
60
182
|
# TODO: Expand on the exact definitions of these types of cells.
|
|
61
183
|
# minimize typing
|
|
@@ -93,26 +215,95 @@ class StdCellLibrarySchema(LibrarySchema):
|
|
|
93
215
|
example=["api: schema.set('asic', 'site', 'Site_12T')"],
|
|
94
216
|
help="Site names for a given library architecture."))
|
|
95
217
|
|
|
96
|
-
def
|
|
218
|
+
def add_asic_pdk(self, pdk, default: bool = True):
|
|
219
|
+
"""
|
|
220
|
+
Adds the PDK associated with this library.
|
|
221
|
+
|
|
222
|
+
Args:
|
|
223
|
+
pdk (class:`PDKSchema`): pdk to associate
|
|
224
|
+
default (bool): if True, sets this PDK in [asic,pdk]
|
|
225
|
+
"""
|
|
226
|
+
from siliconcompiler import PDKSchema
|
|
227
|
+
if isinstance(pdk, PDKSchema):
|
|
228
|
+
pdk_name = pdk.name
|
|
229
|
+
self.add_dep(pdk)
|
|
230
|
+
|
|
231
|
+
if pdk.get("pdk", "stackup"):
|
|
232
|
+
# copy over stackup information
|
|
233
|
+
self.add_asic_stackup(pdk.get("pdk", "stackup"))
|
|
234
|
+
elif default:
|
|
235
|
+
if isinstance(pdk, str):
|
|
236
|
+
pdk_name = pdk
|
|
237
|
+
else:
|
|
238
|
+
raise TypeError("pdk must be a PDK object or string")
|
|
239
|
+
else:
|
|
240
|
+
raise TypeError("pdk must be a PDK object")
|
|
241
|
+
|
|
242
|
+
if default:
|
|
243
|
+
return self.set("asic", "pdk", pdk_name)
|
|
244
|
+
|
|
245
|
+
def add_asic_stackup(self, stackup: Union[str, List[str]]):
|
|
246
|
+
"""
|
|
247
|
+
Set the stackups supported by this library.
|
|
248
|
+
|
|
249
|
+
Args:
|
|
250
|
+
stackup (str or list of str): stackups supported
|
|
251
|
+
"""
|
|
252
|
+
return self.add("asic", "stackup", stackup)
|
|
253
|
+
|
|
254
|
+
def add_asic_libcornerfileset(self, corner: str, model: str, fileset: str = None):
|
|
97
255
|
"""
|
|
98
|
-
Adds a mapping between filesets a corners defined in the library
|
|
256
|
+
Adds a mapping between filesets a corners defined in the library.
|
|
99
257
|
|
|
100
258
|
Args:
|
|
101
259
|
corner (str): name of the timing or parasitic corner
|
|
260
|
+
model (str): type of delay modeling used, eg. ccs, nldm, etc.
|
|
102
261
|
fileset (str): name of the fileset
|
|
103
262
|
"""
|
|
104
263
|
if not fileset:
|
|
105
264
|
fileset = self._get_active("fileset")
|
|
106
265
|
|
|
107
|
-
if not isinstance(
|
|
108
|
-
raise TypeError("
|
|
266
|
+
if not isinstance(model, str):
|
|
267
|
+
raise TypeError("model must be a string")
|
|
109
268
|
|
|
110
|
-
|
|
111
|
-
raise ValueError(f"{fileset} is not defined")
|
|
269
|
+
self._assert_fileset(fileset)
|
|
112
270
|
|
|
113
|
-
return self.add("asic", "
|
|
271
|
+
return self.add("asic", "libcornerfileset", corner, model, fileset)
|
|
114
272
|
|
|
115
|
-
def
|
|
273
|
+
def add_asic_pexcornerfileset(self, corner: str, model: str, fileset: str = None):
|
|
274
|
+
"""
|
|
275
|
+
Adds a mapping between filesets a corners defined in the library.
|
|
276
|
+
|
|
277
|
+
Args:
|
|
278
|
+
corner (str): name of the timing or parasitic corner
|
|
279
|
+
model(str): type of delay modeling used, eg. spice, etc.
|
|
280
|
+
fileset (str): name of the fileset
|
|
281
|
+
"""
|
|
282
|
+
if not fileset:
|
|
283
|
+
fileset = self._get_active("fileset")
|
|
284
|
+
|
|
285
|
+
if not isinstance(model, str):
|
|
286
|
+
raise TypeError("model must be a string")
|
|
287
|
+
|
|
288
|
+
self._assert_fileset(fileset)
|
|
289
|
+
|
|
290
|
+
return self.add("asic", "pexcornerfileset", corner, model, fileset)
|
|
291
|
+
|
|
292
|
+
def add_asic_aprfileset(self, fileset: str = None):
|
|
293
|
+
"""
|
|
294
|
+
Adds a mapping between filesets defined in the library.
|
|
295
|
+
|
|
296
|
+
Args:
|
|
297
|
+
fileset (str): name of the fileset
|
|
298
|
+
"""
|
|
299
|
+
if not fileset:
|
|
300
|
+
fileset = self._get_active("fileset")
|
|
301
|
+
|
|
302
|
+
self._assert_fileset(fileset)
|
|
303
|
+
|
|
304
|
+
return self.add("asic", "aprfileset", fileset)
|
|
305
|
+
|
|
306
|
+
def add_asic_celllist(self, type: str, cells: Union[List[str], str]):
|
|
116
307
|
"""
|
|
117
308
|
Adds a standard cell library to the specified type.
|
|
118
309
|
|
|
@@ -124,10 +315,17 @@ class StdCellLibrarySchema(LibrarySchema):
|
|
|
124
315
|
|
|
125
316
|
def add_asic_site(self, site: Union[List[str], str]):
|
|
126
317
|
"""
|
|
127
|
-
Adds a standard site to the library
|
|
318
|
+
Adds a standard site to the library.
|
|
128
319
|
|
|
129
320
|
Args:
|
|
130
|
-
|
|
131
|
-
cells (list of str): cells to add
|
|
321
|
+
site (list of str or str): sites to add
|
|
132
322
|
"""
|
|
133
323
|
return self.add("asic", "site", site)
|
|
324
|
+
|
|
325
|
+
@classmethod
|
|
326
|
+
def _getdict_type(cls) -> str:
|
|
327
|
+
"""
|
|
328
|
+
Returns the meta data for getdict.
|
|
329
|
+
"""
|
|
330
|
+
|
|
331
|
+
return StdCellLibrarySchema.__name__
|