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))