siliconcompiler 0.34.1__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 +23 -4
- 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 +7 -6
- 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/__init__.py +17 -0
- siliconcompiler/constraints/asic_component.py +378 -0
- siliconcompiler/constraints/asic_floorplan.py +449 -0
- siliconcompiler/constraints/asic_pins.py +489 -0
- siliconcompiler/constraints/asic_timing.py +517 -0
- siliconcompiler/core.py +10 -35
- siliconcompiler/data/templates/tcl/manifest.tcl.j2 +8 -0
- siliconcompiler/dependencyschema.py +96 -202
- siliconcompiler/design.py +327 -241
- siliconcompiler/filesetschema.py +250 -0
- siliconcompiler/flowgraph.py +298 -106
- siliconcompiler/fpga.py +124 -1
- siliconcompiler/library.py +331 -0
- siliconcompiler/metric.py +327 -92
- siliconcompiler/metrics/__init__.py +7 -0
- siliconcompiler/metrics/asic.py +245 -0
- siliconcompiler/metrics/fpga.py +220 -0
- siliconcompiler/package/__init__.py +391 -67
- siliconcompiler/package/git.py +92 -16
- siliconcompiler/package/github.py +114 -22
- siliconcompiler/package/https.py +79 -16
- siliconcompiler/packageschema.py +341 -16
- siliconcompiler/pathschema.py +255 -0
- siliconcompiler/pdk.py +566 -1
- siliconcompiler/project.py +1460 -0
- 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 +81 -4
- siliconcompiler/scheduler/run_node.py +37 -20
- siliconcompiler/scheduler/scheduler.py +211 -36
- siliconcompiler/scheduler/schedulernode.py +394 -60
- siliconcompiler/scheduler/send_messages.py +77 -29
- siliconcompiler/scheduler/slurm.py +76 -12
- siliconcompiler/scheduler/taskscheduler.py +142 -21
- siliconcompiler/schema/__init__.py +0 -4
- siliconcompiler/schema/baseschema.py +338 -59
- siliconcompiler/schema/editableschema.py +14 -6
- siliconcompiler/schema/journal.py +28 -17
- siliconcompiler/schema/namedschema.py +22 -14
- siliconcompiler/schema/parameter.py +89 -28
- siliconcompiler/schema/parametertype.py +2 -0
- siliconcompiler/schema/parametervalue.py +258 -15
- siliconcompiler/schema/safeschema.py +25 -2
- siliconcompiler/schema/schema_cfg.py +23 -19
- siliconcompiler/schema/utils.py +2 -2
- siliconcompiler/schema_obj.py +24 -5
- siliconcompiler/tool.py +1131 -265
- 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.1.dist-info → siliconcompiler-0.34.3.dist-info}/METADATA +6 -6
- {siliconcompiler-0.34.1.dist-info → siliconcompiler-0.34.3.dist-info}/RECORD +122 -115
- {siliconcompiler-0.34.1.dist-info → siliconcompiler-0.34.3.dist-info}/entry_points.txt +3 -0
- siliconcompiler/schema/cmdlineschema.py +0 -250
- siliconcompiler/schema/packageschema.py +0 -101
- 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.1.dist-info → siliconcompiler-0.34.3.dist-info}/WHEEL +0 -0
- {siliconcompiler-0.34.1.dist-info → siliconcompiler-0.34.3.dist-info}/licenses/LICENSE +0 -0
- {siliconcompiler-0.34.1.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'
|
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
from typing import final, Union, List
|
|
2
|
+
|
|
3
|
+
from siliconcompiler import PackageSchema
|
|
4
|
+
|
|
5
|
+
from siliconcompiler.dependencyschema import DependencySchema
|
|
6
|
+
from siliconcompiler.filesetschema import FileSetSchema
|
|
7
|
+
from siliconcompiler.schema import NamedSchema
|
|
8
|
+
|
|
9
|
+
from siliconcompiler.schema import EditableSchema, Parameter, Scope, PerNode
|
|
10
|
+
from siliconcompiler.schema.utils import trim
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class LibrarySchema(FileSetSchema, PackageSchema, NamedSchema):
|
|
14
|
+
"""
|
|
15
|
+
A class for managing library schemas.
|
|
16
|
+
"""
|
|
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
|
+
"""
|
|
24
|
+
super().__init__()
|
|
25
|
+
self.set_name(name)
|
|
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
|
+
"""
|
|
40
|
+
@final
|
|
41
|
+
def define_tool_parameter(self, tool: str, name: str, type: str, help: str, **kwargs):
|
|
42
|
+
"""
|
|
43
|
+
Define a new tool parameter for the library.
|
|
44
|
+
|
|
45
|
+
Args:
|
|
46
|
+
tool (str): name of the tool
|
|
47
|
+
name (str): name of the parameter
|
|
48
|
+
type (str): type of parameter, see :class:`.Parameter`.
|
|
49
|
+
help (str): help information for this parameter
|
|
50
|
+
kwargs: passthrough for :class:`.Parameter`.
|
|
51
|
+
"""
|
|
52
|
+
if isinstance(help, str):
|
|
53
|
+
# grab first line for short help
|
|
54
|
+
help = trim(help)
|
|
55
|
+
shorthelp = help.splitlines()[0].strip()
|
|
56
|
+
else:
|
|
57
|
+
raise TypeError("help must be a string")
|
|
58
|
+
|
|
59
|
+
kwargs["scope"] = Scope.GLOBAL
|
|
60
|
+
kwargs["pernode"] = PerNode.NEVER
|
|
61
|
+
kwargs["shorthelp"] = shorthelp
|
|
62
|
+
kwargs["help"] = help
|
|
63
|
+
|
|
64
|
+
EditableSchema(self).insert(
|
|
65
|
+
"tool", tool, name,
|
|
66
|
+
Parameter(type, **kwargs)
|
|
67
|
+
)
|
|
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"]
|
|
112
|
+
|
|
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
|
+
"""
|
|
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
|
+
"""
|
|
127
|
+
super().__init__()
|
|
128
|
+
self.set_name(name)
|
|
129
|
+
|
|
130
|
+
schema = EditableSchema(self)
|
|
131
|
+
|
|
132
|
+
schema.insert(
|
|
133
|
+
"asic", "pdk",
|
|
134
|
+
Parameter(
|
|
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}',
|
|
176
|
+
scope=Scope.GLOBAL,
|
|
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.""")))
|
|
181
|
+
|
|
182
|
+
# TODO: Expand on the exact definitions of these types of cells.
|
|
183
|
+
# minimize typing
|
|
184
|
+
for item in [
|
|
185
|
+
'decap',
|
|
186
|
+
'tie',
|
|
187
|
+
'hold',
|
|
188
|
+
'clkbuf',
|
|
189
|
+
'clkgate',
|
|
190
|
+
'clklogic',
|
|
191
|
+
'dontuse',
|
|
192
|
+
'filler',
|
|
193
|
+
'tap',
|
|
194
|
+
'endcap',
|
|
195
|
+
'antenna']:
|
|
196
|
+
schema.insert(
|
|
197
|
+
'asic', 'cells', item,
|
|
198
|
+
Parameter(
|
|
199
|
+
'[str]',
|
|
200
|
+
scope=Scope.GLOBAL,
|
|
201
|
+
shorthelp=f"ASIC: {item} cell list",
|
|
202
|
+
example=[f"api: schema.set('asic', 'cells', '{item}', '*eco*')"],
|
|
203
|
+
help=trim("""
|
|
204
|
+
List of cells grouped by a property that can be accessed
|
|
205
|
+
directly by the designer and tools. The example below shows how
|
|
206
|
+
all cells containing the string 'eco' could be marked as dont use
|
|
207
|
+
for the tool.""")))
|
|
208
|
+
|
|
209
|
+
schema.insert(
|
|
210
|
+
'asic', 'site',
|
|
211
|
+
Parameter(
|
|
212
|
+
'[str]',
|
|
213
|
+
scope=Scope.GLOBAL,
|
|
214
|
+
shorthelp="ASIC: library sites",
|
|
215
|
+
example=["api: schema.set('asic', 'site', 'Site_12T')"],
|
|
216
|
+
help="Site names for a given library architecture."))
|
|
217
|
+
|
|
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):
|
|
255
|
+
"""
|
|
256
|
+
Adds a mapping between filesets a corners defined in the library.
|
|
257
|
+
|
|
258
|
+
Args:
|
|
259
|
+
corner (str): name of the timing or parasitic corner
|
|
260
|
+
model (str): type of delay modeling used, eg. ccs, nldm, etc.
|
|
261
|
+
fileset (str): name of the fileset
|
|
262
|
+
"""
|
|
263
|
+
if not fileset:
|
|
264
|
+
fileset = self._get_active("fileset")
|
|
265
|
+
|
|
266
|
+
if not isinstance(model, str):
|
|
267
|
+
raise TypeError("model must be a string")
|
|
268
|
+
|
|
269
|
+
self._assert_fileset(fileset)
|
|
270
|
+
|
|
271
|
+
return self.add("asic", "libcornerfileset", corner, model, fileset)
|
|
272
|
+
|
|
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]):
|
|
307
|
+
"""
|
|
308
|
+
Adds a standard cell library to the specified type.
|
|
309
|
+
|
|
310
|
+
Args:
|
|
311
|
+
type (str): category of cell type
|
|
312
|
+
cells (list of str): cells to add
|
|
313
|
+
"""
|
|
314
|
+
return self.add("asic", "cells", type, cells)
|
|
315
|
+
|
|
316
|
+
def add_asic_site(self, site: Union[List[str], str]):
|
|
317
|
+
"""
|
|
318
|
+
Adds a standard site to the library.
|
|
319
|
+
|
|
320
|
+
Args:
|
|
321
|
+
site (list of str or str): sites to add
|
|
322
|
+
"""
|
|
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__
|