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.
Files changed (121) hide show
  1. siliconcompiler/__init__.py +12 -5
  2. siliconcompiler/__main__.py +1 -7
  3. siliconcompiler/_metadata.py +1 -1
  4. siliconcompiler/apps/_common.py +104 -23
  5. siliconcompiler/apps/sc.py +4 -8
  6. siliconcompiler/apps/sc_dashboard.py +6 -4
  7. siliconcompiler/apps/sc_install.py +10 -6
  8. siliconcompiler/apps/sc_issue.py +7 -5
  9. siliconcompiler/apps/sc_remote.py +1 -1
  10. siliconcompiler/apps/sc_server.py +9 -14
  11. siliconcompiler/apps/sc_show.py +6 -5
  12. siliconcompiler/apps/smake.py +130 -94
  13. siliconcompiler/apps/utils/replay.py +4 -7
  14. siliconcompiler/apps/utils/summarize.py +3 -5
  15. siliconcompiler/asic.py +420 -0
  16. siliconcompiler/checklist.py +25 -2
  17. siliconcompiler/cmdlineschema.py +534 -0
  18. siliconcompiler/constraints/asic_component.py +2 -2
  19. siliconcompiler/constraints/asic_pins.py +2 -2
  20. siliconcompiler/constraints/asic_timing.py +3 -3
  21. siliconcompiler/core.py +7 -32
  22. siliconcompiler/data/templates/tcl/manifest.tcl.j2 +8 -0
  23. siliconcompiler/dependencyschema.py +89 -31
  24. siliconcompiler/design.py +176 -207
  25. siliconcompiler/filesetschema.py +250 -0
  26. siliconcompiler/flowgraph.py +274 -95
  27. siliconcompiler/fpga.py +124 -1
  28. siliconcompiler/library.py +218 -20
  29. siliconcompiler/metric.py +233 -20
  30. siliconcompiler/package/__init__.py +271 -50
  31. siliconcompiler/package/git.py +92 -16
  32. siliconcompiler/package/github.py +108 -12
  33. siliconcompiler/package/https.py +79 -16
  34. siliconcompiler/packageschema.py +88 -7
  35. siliconcompiler/pathschema.py +31 -2
  36. siliconcompiler/pdk.py +566 -1
  37. siliconcompiler/project.py +1095 -94
  38. siliconcompiler/record.py +38 -1
  39. siliconcompiler/remote/__init__.py +5 -2
  40. siliconcompiler/remote/client.py +11 -6
  41. siliconcompiler/remote/schema.py +5 -23
  42. siliconcompiler/remote/server.py +41 -54
  43. siliconcompiler/report/__init__.py +3 -3
  44. siliconcompiler/report/dashboard/__init__.py +48 -14
  45. siliconcompiler/report/dashboard/cli/__init__.py +99 -21
  46. siliconcompiler/report/dashboard/cli/board.py +364 -179
  47. siliconcompiler/report/dashboard/web/__init__.py +90 -12
  48. siliconcompiler/report/dashboard/web/components/__init__.py +219 -240
  49. siliconcompiler/report/dashboard/web/components/flowgraph.py +49 -26
  50. siliconcompiler/report/dashboard/web/components/graph.py +139 -100
  51. siliconcompiler/report/dashboard/web/layouts/__init__.py +29 -1
  52. siliconcompiler/report/dashboard/web/layouts/_common.py +38 -2
  53. siliconcompiler/report/dashboard/web/layouts/vertical_flowgraph.py +39 -26
  54. siliconcompiler/report/dashboard/web/layouts/vertical_flowgraph_node_tab.py +50 -50
  55. siliconcompiler/report/dashboard/web/layouts/vertical_flowgraph_sac_tabs.py +49 -46
  56. siliconcompiler/report/dashboard/web/state.py +141 -14
  57. siliconcompiler/report/dashboard/web/utils/__init__.py +79 -16
  58. siliconcompiler/report/dashboard/web/utils/file_utils.py +74 -11
  59. siliconcompiler/report/dashboard/web/viewer.py +25 -1
  60. siliconcompiler/report/report.py +5 -2
  61. siliconcompiler/report/summary_image.py +29 -11
  62. siliconcompiler/scheduler/__init__.py +9 -1
  63. siliconcompiler/scheduler/docker.py +79 -1
  64. siliconcompiler/scheduler/run_node.py +35 -19
  65. siliconcompiler/scheduler/scheduler.py +208 -24
  66. siliconcompiler/scheduler/schedulernode.py +372 -46
  67. siliconcompiler/scheduler/send_messages.py +77 -29
  68. siliconcompiler/scheduler/slurm.py +76 -12
  69. siliconcompiler/scheduler/taskscheduler.py +140 -20
  70. siliconcompiler/schema/__init__.py +0 -2
  71. siliconcompiler/schema/baseschema.py +194 -38
  72. siliconcompiler/schema/journal.py +7 -4
  73. siliconcompiler/schema/namedschema.py +16 -10
  74. siliconcompiler/schema/parameter.py +55 -9
  75. siliconcompiler/schema/parametervalue.py +60 -0
  76. siliconcompiler/schema/safeschema.py +25 -2
  77. siliconcompiler/schema/schema_cfg.py +5 -5
  78. siliconcompiler/schema/utils.py +2 -2
  79. siliconcompiler/schema_obj.py +20 -3
  80. siliconcompiler/tool.py +979 -302
  81. siliconcompiler/tools/bambu/__init__.py +41 -0
  82. siliconcompiler/tools/builtin/concatenate.py +2 -2
  83. siliconcompiler/tools/builtin/minimum.py +2 -1
  84. siliconcompiler/tools/builtin/mux.py +2 -1
  85. siliconcompiler/tools/builtin/nop.py +2 -1
  86. siliconcompiler/tools/builtin/verify.py +2 -1
  87. siliconcompiler/tools/klayout/__init__.py +95 -0
  88. siliconcompiler/tools/openroad/__init__.py +289 -0
  89. siliconcompiler/tools/openroad/scripts/apr/preamble.tcl +3 -0
  90. siliconcompiler/tools/openroad/scripts/apr/sc_detailed_route.tcl +7 -2
  91. siliconcompiler/tools/openroad/scripts/apr/sc_global_route.tcl +8 -4
  92. siliconcompiler/tools/openroad/scripts/apr/sc_init_floorplan.tcl +9 -5
  93. siliconcompiler/tools/openroad/scripts/common/write_images.tcl +5 -1
  94. siliconcompiler/tools/slang/__init__.py +1 -1
  95. siliconcompiler/tools/slang/elaborate.py +2 -1
  96. siliconcompiler/tools/vivado/scripts/sc_run.tcl +1 -1
  97. siliconcompiler/tools/vivado/scripts/sc_syn_fpga.tcl +8 -1
  98. siliconcompiler/tools/vivado/syn_fpga.py +6 -0
  99. siliconcompiler/tools/vivado/vivado.py +35 -2
  100. siliconcompiler/tools/vpr/__init__.py +150 -0
  101. siliconcompiler/tools/yosys/__init__.py +369 -1
  102. siliconcompiler/tools/yosys/scripts/procs.tcl +0 -1
  103. siliconcompiler/toolscripts/_tools.json +5 -10
  104. siliconcompiler/utils/__init__.py +66 -0
  105. siliconcompiler/utils/flowgraph.py +2 -2
  106. siliconcompiler/utils/issue.py +2 -1
  107. siliconcompiler/utils/logging.py +14 -0
  108. siliconcompiler/utils/multiprocessing.py +256 -0
  109. siliconcompiler/utils/showtools.py +10 -0
  110. {siliconcompiler-0.34.2.dist-info → siliconcompiler-0.34.3.dist-info}/METADATA +5 -5
  111. {siliconcompiler-0.34.2.dist-info → siliconcompiler-0.34.3.dist-info}/RECORD +115 -118
  112. {siliconcompiler-0.34.2.dist-info → siliconcompiler-0.34.3.dist-info}/entry_points.txt +3 -0
  113. siliconcompiler/schema/cmdlineschema.py +0 -250
  114. siliconcompiler/toolscripts/rhel8/install-slang.sh +0 -40
  115. siliconcompiler/toolscripts/rhel9/install-slang.sh +0 -40
  116. siliconcompiler/toolscripts/ubuntu20/install-slang.sh +0 -47
  117. siliconcompiler/toolscripts/ubuntu22/install-slang.sh +0 -37
  118. siliconcompiler/toolscripts/ubuntu24/install-slang.sh +0 -37
  119. {siliconcompiler-0.34.2.dist-info → siliconcompiler-0.34.3.dist-info}/WHEEL +0 -0
  120. {siliconcompiler-0.34.2.dist-info → siliconcompiler-0.34.3.dist-info}/licenses/LICENSE +0 -0
  121. {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
- class FPGASchema(BaseSchema):
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'
@@ -1,20 +1,46 @@
1
1
  from typing import final, Union, List
2
2
 
3
- from siliconcompiler.design import DesignSchema
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(DesignSchema):
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
- class StdCellLibrarySchema(LibrarySchema):
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
- 'asic', 'cornerfilesets', 'default',
133
+ "asic", "pdk",
53
134
  Parameter(
54
- '[str]',
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 timing or pex corners",
57
- example=["api: schema.set('asic', 'cornerfilesets', 'slow', 'timing.slow')"],
58
- help=trim("""Map between filesets and timing or pex corners.""")))
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 add_asic_corner_fileset(self, corner: str, fileset: str = None):
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(fileset, str):
108
- raise TypeError("fileset must be a string")
266
+ if not isinstance(model, str):
267
+ raise TypeError("model must be a string")
109
268
 
110
- if fileset not in self.getkeys("fileset"):
111
- raise ValueError(f"{fileset} is not defined")
269
+ self._assert_fileset(fileset)
112
270
 
113
- return self.add("asic", "cornerfilesets", corner, fileset)
271
+ return self.add("asic", "libcornerfileset", corner, model, fileset)
114
272
 
115
- def add_asic_cell_list(self, type: str, cells: Union[List[str], str]):
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
- type (str): category of cell type
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__