Trying to make cell names working.
diff --git a/scripts/python-skywater-pdk/skywater_pdk/analyze.py b/scripts/python-skywater-pdk/skywater_pdk/analyze.py
new file mode 100644
index 0000000..9ac719d
--- /dev/null
+++ b/scripts/python-skywater-pdk/skywater_pdk/analyze.py
@@ -0,0 +1,57 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+#
+# Copyright 2020 The SkyWater PDK Authors.
+#
+# Use of this source code is governed by the Apache 2.0
+# license that can be found in the LICENSE file or at
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# SPDX-License-Identifier: Apache-2.0
+
+
+import os
+import sys
+import traceback
+
+from .base import parse_filename as parse_filename_base
+from .corners import parse_filename as parse_filename_corners
+
+
+def analyze(pathname):
+ print()
+ print(pathname)
+
+ try:
+ obj, extra, extension = parse_filename_base(pathname)
+ print(extension)
+ print(obj)
+ except Exception as e:
+ traceback.print_exc()
+ return
+
+ if not extra:
+ return
+
+ try:
+ corners = parse_filename_corners(extra)
+ print(corners)
+ except Exception as e:
+ traceback.print_exc()
+ return
+
+
+def main(argv):
+ for a in argv[1:]:
+ if os.path.isdir(a):
+ for root, _, files in os.walk(a):
+ for f in files:
+ pathname = os.path.join(a, root, f)
+ analyze(pathname)
+ elif os.path.isfile(a):
+ analyze(a)
+
+
+if __name__ == "__main__":
+ import sys
+ sys.exit(main(sys.argv))
diff --git a/scripts/python-skywater-pdk/skywater_pdk/base.py b/scripts/python-skywater-pdk/skywater_pdk/base.py
index 65c51a7..e4c7037 100644
--- a/scripts/python-skywater-pdk/skywater_pdk/base.py
+++ b/scripts/python-skywater-pdk/skywater_pdk/base.py
@@ -19,14 +19,14 @@
def parse_filename(pathname):
"""Extract library and module name from pathname.
- >>> t = list(parse_filename('sky130_fd_io-top_ground_padonlyv2-tt_1p80V_3p30V_3p30V_25C.wrap.lib'))
+ >>> t = list(parse_filename('sky130_fd_io__top_ground_padonlyv2__tt_1p80V_3p30V_3p30V_25C.wrap.lib'))
>>> t.pop(0)
Cell(name='top_ground_padonlyv2', library=Library(node=LibraryNode.SKY130, source=LibrarySource('fd'), type=LibraryType.io, name=None, version=None))
>>> t.pop(0)
'tt_1p80V_3p30V_3p30V_25C'
>>> t.pop(0)
'wrap.lib'
- >>> t = list(parse_filename('v0.10.0/sky130_fd_sc_hdll-a211o-tt_1p80V_3p30V_3p30V_25C.wrap.json'))
+ >>> t = list(parse_filename('v0.10.0/sky130_fd_sc_hdll__a211o__tt_1p80V_3p30V_3p30V_25C.wrap.json'))
>>> t.pop(0)
Cell(name='a211o', library=Library(node=LibraryNode.SKY130, source=LibrarySource('fd'), type=LibraryType.sc, name='hdll', version=LibraryVersion(milestone=0, major=10, minor=0, commits=0, hash='')))
>>> t.pop(0)
@@ -34,23 +34,42 @@
>>> t.pop(0)
'wrap.json'
+ >>> t = list(parse_filename('sky130_fd_io/v0.1.0/sky130_fd_io__top_powerhv_hvc_wpad__tt_1p80V_3p30V_100C.wrap.json'))
+ >>> t.pop(0)
+ Cell(name='top_powerhv_hvc_wpad', library=Library(node=LibraryNode.SKY130, source=LibrarySource('fd'), type=LibraryType.io, name=None, version=LibraryVersion(milestone=0, major=1, minor=0, commits=0, hash='')))
+ >>> from skywater_pdk.corners import parse_filename as pf_corners
+ >>> pf_corners(t.pop(0))
+ Corner(volts=[1.8, 3.3], temps=[100], flags=[], types=[CornerType.t, CornerType.t])
+ >>> t.pop(0)
+ 'wrap.json'
+
+ >>> parse_filename('libraries/sky130_fd_io/v0.2.1/cells/analog_pad/sky130_fd_io-analog_pad.blackbox.v')[0]
+ Library(node=LibraryNode.SKY130, source=LibrarySource('fd'), type=LibraryType.io, name=None, version=LibraryVersion(milestone=0, major=2, minor=1, commits=0, hash=''))
+
"""
dirname, filename = os.path.split(pathname)
-
+ # Extract a version if it exists.
dirbase, dirversion = os.path.split(dirname)
+ if dirbase.endswith('/cells'):
+ dirbase, dirversion = os.path.split(dirbase)
+ assert dirversion == 'cells', (dirbase, dirversion)
+ dirbase, dirversion = os.path.split(dirbase)
try:
version = LibraryVersion.parse(dirversion)
except TypeError:
version = None
+ # Extract the file extension
if '.' in filename:
basename, extension = filename.split('.', 1)
else:
basename = filename
extension = ''
- basename = basename.replace('-', SEPERATOR)
+ basename = basename.replace('-', SEPERATOR) # FIXME: !!!
+
+ # Parse the actual filename
bits = basename.split(SEPERATOR, 3)
if len(bits) in (1, 2):
library = Library.parse(bits.pop(0))
diff --git a/scripts/python-skywater-pdk/skywater_pdk/corners.py b/scripts/python-skywater-pdk/skywater_pdk/corners.py
index d43c7d6..533edac 100644
--- a/scripts/python-skywater-pdk/skywater_pdk/corners.py
+++ b/scripts/python-skywater-pdk/skywater_pdk/corners.py
@@ -16,7 +16,7 @@
from dataclasses import dataclass
from typing import List, Optional
-from .base import parse_filename as base_parse_filename
+from . import base
CornerTypeMappings = {}
@@ -93,35 +93,44 @@
def parse_filename(pathname):
"""Extract corner information from a filename.
- >>> parse_filename('sky130_fd_io-top_ground_padonlyv2-tt_1p80V_3p30V_3p30V_25C.wrap.lib')
+ >>> parse_filename('tt_1p80V_3p30V_3p30V_25C')
Corner(volts=[1.8, 3.3, 3.3], temps=[25], flags=[], types=[CornerType.t, CornerType.t])
- >>> parse_filename('sky130_fd_sc_ms-tt_1p80V_100C.wrap.json')
+ >>> parse_filename('sky130_fd_io__top_ground_padonlyv2__tt_1p80V_3p30V_3p30V_25C.wrap.lib')
+ Corner(volts=[1.8, 3.3, 3.3], temps=[25], flags=[], types=[CornerType.t, CornerType.t])
+
+ >>> parse_filename('sky130_fd_sc_ms__tt_1p80V_100C.wrap.json')
Corner(volts=[1.8], temps=[100], flags=[], types=[CornerType.t, CornerType.t])
- >>> parse_filename('sky130_fd_sc_ms-tt_1p80V_100C.wrap.lib')
+ >>> parse_filename('sky130_fd_sc_ms__tt_1p80V_100C.wrap.lib')
Corner(volts=[1.8], temps=[100], flags=[], types=[CornerType.t, CornerType.t])
- >>> parse_filename('sky130_fd_sc_ms-tt_1p80V_25C_ccsnoise.wrap.json')
+ >>> parse_filename('sky130_fd_sc_ms__tt_1p80V_25C_ccsnoise.wrap.json')
Corner(volts=[1.8], temps=[25], flags=[CornerType.ccsnoise], types=[CornerType.t, CornerType.t])
- >>> parse_filename('sky130_fd_sc_ms-wp_1p56V_n40C_5ns.wrap.json')
+ >>> parse_filename('sky130_fd_sc_ms__wp_1p56V_n40C_5ns.wrap.json')
Corner(volts=[1.56], temps=[-40], flags=[CornerType.ns5], types=[CornerType.f, CornerType.s])
- >>> parse_filename('sky130_fd_sc_ms-wp_1p65V_n40C.wrap.json')
+ >>> parse_filename('sky130_fd_sc_ms__wp_1p65V_n40C.wrap.json')
Corner(volts=[1.65], temps=[-40], flags=[], types=[CornerType.f, CornerType.s])
- >>> parse_filename('sky130_fd_sc_ms-wp_1p95V_85C_pwr.wrap.lib')
+ >>> parse_filename('sky130_fd_sc_ms__wp_1p95V_85C_pwr.wrap.lib')
Corner(volts=[1.95], temps=[85], flags=[CornerType.pwr], types=[CornerType.f, CornerType.s])
- >>> parse_filename('sky130_fd_sc_ms-wp_1p95V_n40C_ccsnoise.wrap.json')
+ >>> parse_filename('sky130_fd_sc_ms__wp_1p95V_n40C_ccsnoise.wrap.json')
Corner(volts=[1.95], temps=[-40], flags=[CornerType.ccsnoise], types=[CornerType.f, CornerType.s])
- >>> parse_filename('sky130_fd_sc_ms-wp_1p95V_n40C_pwr.wrap.lib')
+ >>> parse_filename('sky130_fd_sc_ms__wp_1p95V_n40C_pwr.wrap.lib')
Corner(volts=[1.95], temps=[-40], flags=[CornerType.pwr], types=[CornerType.f, CornerType.s])
"""
- cell, extra, extension = base_parse_filename(pathname)
+ pathname = pathname.replace('-', base.SEPERATOR) # FIXME: !!!
+
+ if base.SEPERATOR in pathname:
+ _, extra, extension = base.parse_filename(pathname)
+ else:
+ extra = pathname
+ extension = ''
if extension not in ('', 'lib', 'wrap.lib', 'wrap.json'):
raise ValueError('Not possible to extract corners from: {!r}'.format(extension))