From ae1e5f618145fe20931a1c40b46835268057422e Mon Sep 17 00:00:00 2001 From: Wojciech Gryncewicz Date: Mon, 21 Dec 2020 11:58:59 +0100 Subject: [PATCH 1/2] netlist json generator added --- .../skywater_pdk/cell/generate/netlistjson.py | 114 ++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100755 scripts/python-skywater-pdk/skywater_pdk/cell/generate/netlistjson.py diff --git a/scripts/python-skywater-pdk/skywater_pdk/cell/generate/netlistjson.py b/scripts/python-skywater-pdk/skywater_pdk/cell/generate/netlistjson.py new file mode 100755 index 000000000..b76b676e8 --- /dev/null +++ b/scripts/python-skywater-pdk/skywater_pdk/cell/generate/netlistjson.py @@ -0,0 +1,114 @@ +#!/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 +import argparse +import pathlib +import glob +import subprocess + +def write_netlistsvg(cellpath, define_data): + ''' Generates netlist json 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') + # verilog source: functional description used + verilog = os.path.join(cellpath, define_data['file_prefix']+'.functional.v') + if not os.path.exists(verilog): + print("No verilog file in", cellpath) + assert os.path.exists(verilog), verilog + + yosyscmd = ['yosys', '-p'] + yosyscmd.append ('prep -top ' + define_data['verilog_name'] + '; write_json ' + netlist_json) + yosyscmd.append (verilog) + if subprocess.call( yosyscmd ) : + print ('EERROR') + yosyscmd[2] = '"' + yosyscmd[2] + '"' + print (''.join(yosyscmd)) + raise ChildProcessError(define_data['file_prefix'],"yosys 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') + 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(): + ''' Generates netlist json from cell verilog file.''' + + prereq_txt = 'prerequisities:\n yosys' + output_txt = 'output:\n generates [cell_prefix].json' + 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 d in cell_dirs: + try: + 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(cell_dirs)} files processed, {errors} errors.') + return 0 if errors else 1 + +if __name__ == "__main__": + sys.exit(main()) + From 9afd6a8f500510a3b7c179d050a74b1d91191c2a Mon Sep 17 00:00:00 2001 From: Wojciech Gryncewicz Date: Wed, 30 Dec 2020 17:12:07 +0100 Subject: [PATCH 2/2] Added defines to Yosys call --- .../skywater_pdk/cell/generate/netlistjson.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/scripts/python-skywater-pdk/skywater_pdk/cell/generate/netlistjson.py b/scripts/python-skywater-pdk/skywater_pdk/cell/generate/netlistjson.py index b76b676e8..b44dd34e3 100755 --- a/scripts/python-skywater-pdk/skywater_pdk/cell/generate/netlistjson.py +++ b/scripts/python-skywater-pdk/skywater_pdk/cell/generate/netlistjson.py @@ -34,11 +34,10 @@ def write_netlistsvg(cellpath, define_data): print("No verilog file in", cellpath) assert os.path.exists(verilog), verilog - yosyscmd = ['yosys', '-p'] + yosyscmd = ['yosys', '-D NO_PRIMITIVES', '-D UNIT_DELAY #1', '-p'] yosyscmd.append ('prep -top ' + define_data['verilog_name'] + '; write_json ' + netlist_json) yosyscmd.append (verilog) if subprocess.call( yosyscmd ) : - print ('EERROR') yosyscmd[2] = '"' + yosyscmd[2] + '"' print (''.join(yosyscmd)) raise ChildProcessError(define_data['file_prefix'],"yosys execution failed")