Moved to argparse, pathlib, subprocess
Signed-off-by: Wojciech Gryncewicz <wgryncewicz@antmicro.com>
This commit is contained in:
parent
3a9fef6ed1
commit
17c37e15cc
|
@ -14,17 +14,25 @@ import csv
|
|||
import json
|
||||
import os
|
||||
import sys
|
||||
|
||||
|
||||
# prerequisities: netlistsvg
|
||||
# input: paths to cell dirs, containing Yosys netlist
|
||||
# output: generates [cell_prefix].schematic.svg
|
||||
# example usage 1: ./netlistsvg-generate.py \
|
||||
# ../../../libraries/sky130_fd_sc_ms/latest/cells/a2111o \
|
||||
# ../../../libraries/sky130_fd_sc_ms/latest/cells/a2111oi
|
||||
# example usage 2: ./netlistsvg-generate.py ALLLIBS
|
||||
import argparse
|
||||
import pathlib
|
||||
import glob
|
||||
import subprocess
|
||||
|
||||
def outfile(cellpath, define_data, ftype='', extra='', exists=False):
|
||||
''' Determines output file path and name.
|
||||
|
||||
Args:
|
||||
cellpath - path to a cell [str of pathlib.Path]
|
||||
define_data - cell definition data [dic]
|
||||
ftype - file type suffix [str]
|
||||
extra - extra suffix [str]
|
||||
exist - optional check if file exists [bool or None]
|
||||
|
||||
Returns:
|
||||
outpath - output file namepath [str]
|
||||
'''
|
||||
|
||||
fname = define_data['name'].lower().replace('$', '_')
|
||||
if ftype:
|
||||
ftype = '.'+ftype
|
||||
|
@ -40,18 +48,29 @@ def outfile(cellpath, define_data, ftype='', extra='', exists=False):
|
|||
|
||||
|
||||
def write_netlistsvg(cellpath, define_data):
|
||||
''' Generates netlistsvg for a given cell.
|
||||
|
||||
Args:
|
||||
cellpath - path to a cell [str of pathlib.Path]
|
||||
define_data - cell definition data [dic]
|
||||
'''
|
||||
|
||||
netlist_json = os.path.join(cellpath, define_data['file_prefix']+'.json')
|
||||
if not os.path.exists(netlist_json):
|
||||
print("No " + define_data['file_prefix'] + ".json in", cellpath)
|
||||
print("No netlist in", cellpath)
|
||||
assert os.path.exists(netlist_json), netlist_json
|
||||
outpath = outfile(cellpath, define_data, 'schematic')
|
||||
oscmd = 'netlistsvg ' + netlist_json + ' -o ' + outpath
|
||||
r = os.system(oscmd)>>8
|
||||
assert r == 0
|
||||
return r
|
||||
|
||||
if subprocess.call(['netlistsvg', netlist_json, '-o', outpath]):
|
||||
raise ChildProcessError("netlistsvg execution failed")
|
||||
|
||||
def process(cellpath):
|
||||
''' Processes cell indicated by path.
|
||||
Opens cell definiton and calls further processing
|
||||
|
||||
Args:
|
||||
cellpath - path to a cell [str of pathlib.Path]
|
||||
'''
|
||||
|
||||
print()
|
||||
print(cellpath)
|
||||
define_json = os.path.join(cellpath, 'definition.json')
|
||||
|
@ -66,20 +85,50 @@ def process(cellpath):
|
|||
return
|
||||
|
||||
|
||||
def main(args):
|
||||
if len(args) and args[0] == 'ALLLIBS':
|
||||
scrpath = os.path.dirname(os.path.realpath(__file__))
|
||||
relpath = '/../../../libraries/*/latest/cells/*'
|
||||
#relpath = '/../../../libraries/*ms/latest/cells/x*' # DBG: limited
|
||||
args = os.popen('ls -d ' + scrpath + relpath).read().strip().split('\n')
|
||||
def main():
|
||||
''' Generates netlistsvg schematic from cell netlist.'''
|
||||
|
||||
prereq_txt = 'prerequisities:\n netlistsvg'
|
||||
output_txt = 'output:\n generates [cell_prefix].schematic.svg'
|
||||
allcellpath = '../../../libraries/*/latest/cells/*'
|
||||
|
||||
parser = argparse.ArgumentParser(
|
||||
description = main.__doc__,
|
||||
epilog = prereq_txt +'\n\n'+ output_txt,
|
||||
formatter_class=argparse.RawDescriptionHelpFormatter)
|
||||
parser.add_argument(
|
||||
"--all_libs",
|
||||
help="process all cells in "+allcellpath,
|
||||
action="store_true")
|
||||
parser.add_argument(
|
||||
"cell_dir",
|
||||
help="path to the cell directory",
|
||||
type=pathlib.Path,
|
||||
nargs="*")
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
if args.all_libs:
|
||||
path = pathlib.Path(allcellpath).expanduser()
|
||||
parts = path.parts[1:] if path.is_absolute() else path.parts
|
||||
paths = pathlib.Path(path.root).glob(str(pathlib.Path("").joinpath(*parts)))
|
||||
args.cell_dir = list(paths)
|
||||
|
||||
cell_dirs = [d.resolve() for d in args.cell_dir if d.is_dir()]
|
||||
|
||||
errors = 0
|
||||
for a in args:
|
||||
for d in cell_dirs:
|
||||
try:
|
||||
process(os.path.realpath(a))
|
||||
except:
|
||||
process(d)
|
||||
except KeyboardInterrupt:
|
||||
sys.exit(1)
|
||||
except (AssertionError, FileNotFoundError, ChildProcessError) as ex:
|
||||
print (f'Error: {type(ex).__name__}')
|
||||
print (f'{ex.args}')
|
||||
errors +=1
|
||||
print (f'\n{len(args)} files processed, {errors} errors.')
|
||||
print (f'\n{len(cell_dirs)} files processed, {errors} errors.')
|
||||
return 0 if errors else 1
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main(sys.argv[1:]))
|
||||
sys.exit(main())
|
||||
|
||||
|
|
Loading…
Reference in New Issue