Skip to content

Commit

Permalink
Added netlistsvg wrapper/generator
Browse files Browse the repository at this point in the history
  • Loading branch information
wgryncewicz committed Nov 17, 2020
1 parent c06bef0 commit 3a9fef6
Showing 1 changed file with 85 additions and 0 deletions.
85 changes: 85 additions & 0 deletions scripts/python-skywater-pdk/skywater_pdk/netlistsvg-generate.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
#!/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 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

def outfile(cellpath, define_data, ftype='', extra='', exists=False):
fname = define_data['name'].lower().replace('$', '_')
if ftype:
ftype = '.'+ftype
outpath = os.path.join(cellpath, f'{define_data["file_prefix"]}{extra}{ftype}.svg')
if exists is None:
pass
elif not exists:
#assert not os.path.exists(outpath), "Refusing to overwrite existing file:"+outpath
print("Creating", outpath)
elif exists:
assert os.path.exists(outpath), "Missing required:"+outpath
return outpath


def write_netlistsvg(cellpath, define_data):
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)
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


def process(cellpath):
print()
print(cellpath)
define_json = os.path.join(cellpath, 'definition.json')
if not os.path.exists(define_json):
print("No definition.json in", cellpath)
assert os.path.exists(define_json), define_json
define_data = json.load(open(define_json))

if define_data['type'] == 'cell':
write_netlistsvg(cellpath, define_data)

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')
errors = 0
for a in args:
try:
process(os.path.realpath(a))
except:
errors +=1
print (f'\n{len(args)} files processed, {errors} errors.')

if __name__ == "__main__":
sys.exit(main(sys.argv[1:]))

0 comments on commit 3a9fef6

Please sign in to comment.