ci: drop configure script
diff --git a/.github/workflows/user_project_ci.yml b/.github/workflows/user_project_ci.yml index aff407b..feb6f2e 100644 --- a/.github/workflows/user_project_ci.yml +++ b/.github/workflows/user_project_ci.yml
@@ -62,11 +62,6 @@ with: python-version: '3.10' - - name: fetch verilog and build config - run: | - python -m pip install requests PyYAML Jinja2 - python configure.py --create-user-config - - name: harden tiny_user_project run: | make tiny_user_project
diff --git a/configure.py b/configure.py deleted file mode 100755 index 9730dd4..0000000 --- a/configure.py +++ /dev/null
@@ -1,183 +0,0 @@ -#!/usr/bin/env python3 -import requests -import argparse -import os -import glob -import json -import yaml -import logging -import sys -import csv -import re -import jinja2 - -GPIO_VALID_RANGE = [8, 36] - -def load_yaml(yaml_file): - with open(yaml_file, "r") as stream: - return (yaml.safe_load(stream)) - -def write_user_config(module_name, sources, io_ranges): - env = jinja2.Environment( - loader = jinja2.FileSystemLoader('verilog/rtl') - ) - top_module_template = env.get_template('tiny_user_project.v.jinja2') - with open('verilog/rtl/tiny_user_project.v', 'w') as fh: - fh.write(top_module_template.render( - module_name=module_name, - io_in_range=io_ranges[0], - io_out_range=io_ranges[1] - )) - user_defines_template = env.get_template('user_defines.v.jinja2') - with open('verilog/rtl/user_defines.v', 'w') as fh: - fh.write(user_defines_template.render( - io_in_range=io_ranges[0], - io_out_range=io_ranges[1] - )) - with open('openlane/tiny_user_project/config.json', 'r') as fh: - config_json = json.load(fh) - sources.append('verilog/rtl/defines.v') - sources.append('verilog/rtl/tiny_user_project.v') - config_json['VERILOG_FILES'] = [f'dir::../../{s}' for s in sources] - with open('openlane/tiny_user_project/config.json', 'w') as fh: - json.dump(config_json, fh, indent=4) - -def get_project_source(yaml): - # wokwi_id must be an int or 0 - try: - wokwi_id = int(yaml['project']['wokwi_id']) - except ValueError: - logging.error("wokwi id must be an integer") - exit(1) - - # it's a wokwi project - if wokwi_id != 0: - url = "https://wokwi.com/api/projects/{}/verilog".format(wokwi_id) - logging.info("trying to download {}".format(url)) - r = requests.get(url) - if r.status_code != 200: - logging.warning("couldn't download {}".format(url)) - exit(1) - - filename = "user_module.v" - with open(os.path.join('verilog/rtl', filename), 'wb') as fh: - fh.write(r.content) - - # also fetch the wokwi diagram - url = "https://wokwi.com/api/projects/{}/diagram.json".format(wokwi_id) - logging.info("trying to download {}".format(url)) - r = requests.get(url) - if r.status_code != 200: - logging.warning("couldn't download {}".format(url)) - exit(1) - - with open(os.path.join('verilog/rtl', "wokwi_diagram.json"), 'wb') as fh: - fh.write(r.content) - - return [f'verilog/rtl/{filename}', 'verilog/rtl/cells.v'] - - # else it's HDL, so check source files - else: - if 'source_files' not in yaml['project']: - logging.error("source files must be provided if wokwi_id is set to 0") - exit(1) - - source_files = yaml['project']['source_files'] - if source_files is None: - logging.error("must be more than 1 source file") - exit(1) - - if len(source_files) == 0: - logging.error("must be more than 1 source file") - exit(1) - - if 'top_module' not in yaml['project']: - logging.error("must provide a top module name") - exit(1) - - return source_files - - -# documentation -def check_docs(yaml): - for key in ['author', 'title', 'description', 'how_it_works', 'how_to_test', 'language']: - if key not in yaml['documentation']: - logging.error("missing key {} in documentation".format(key)) - exit(1) - if yaml['documentation'][key] == "": - logging.error("missing value for {} in documentation".format(key)) - exit(1) - - # if provided, check discord handle is valid - if len(yaml['documentation']['discord']): - parts = yaml['documentation']['discord'].split('#') - if len(parts) != 2 or len(parts[0]) == 0 or not re.match('^[0-9]{4}$', parts[1]): - logging.error(f'Invalid format for discord username') - exit(1) - - -def get_top_module(yaml): - wokwi_id = int(yaml['project']['wokwi_id']) - if wokwi_id != 0: - return "user_module_{}".format(wokwi_id) - else: - return yaml['project']['top_module'] - -def get_io_ranges(yaml): - input_range = (GPIO_VALID_RANGE[0], GPIO_VALID_RANGE[0]+len(yaml['documentation']['inputs'])) - output_range = (input_range[1], input_range[1]+len(yaml['documentation']['outputs'])) - gpio_end = output_range[1] - if gpio_end > GPIO_VALID_RANGE[1]: - raise Exception('ETOOMANY IOs') - return (input_range, output_range) - -def get_stats(): - with open('runs/wokwi/reports/metrics.csv') as f: - report = list(csv.DictReader(f))[0] - - print('# Routing stats') - print() - print('| Utilisation | Wire length (um) |') - print('|-------------|------------------|') - print('| {} | {} |'.format(report['OpenDP_Util'], report['wire_length'])) - - -if __name__ == '__main__': - parser = argparse.ArgumentParser(description="TT setup") - - parser.add_argument('--check-docs', help="check the documentation part of the yaml", action="store_const", const=True) - parser.add_argument('--get-stats', help="print some stats from the run", action="store_const", const=True) - parser.add_argument('--create-user-config', help="create the user_config.tcl file with top module and source files", action="store_const", const=True) - parser.add_argument('--debug', help="debug logging", action="store_const", dest="loglevel", const=logging.DEBUG, default=logging.INFO) - parser.add_argument('--yaml', help="yaml file to load", default='info.yaml') - - args = parser.parse_args() - # setup log - log_format = logging.Formatter('%(asctime)s - %(module)-10s - %(levelname)-8s - %(message)s') - # configure the client logging - log = logging.getLogger('') - # has to be set to debug as is the root logger - log.setLevel(args.loglevel) - - # create console handler and set level to info - ch = logging.StreamHandler(sys.stdout) - # create formatter for console - ch.setFormatter(log_format) - log.addHandler(ch) - - if args.get_stats: - get_stats() - - elif args.check_docs: - logging.info("checking docs") - config = load_yaml(args.yaml) - check_docs(config) - - elif args.create_user_config: - logging.info("creating include file") - config = load_yaml(args.yaml) - source_files = get_project_source(config) - top_module = get_top_module(config) - assert top_module != 'top' - io_ranges = get_io_ranges(config) - write_user_config(top_module, source_files, io_ranges)