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