[syn] Synth flow improvements

Adds significant functionality to synthesis flow. Timing reports are
generated using OpenSTA and an area report is generated. Flow supports
open Nangate45 library from OpenROAD.
This commit is contained in:
Greg Chadwick 2019-09-26 15:27:08 +01:00
parent 9c6ddae626
commit 79bb6c7832
22 changed files with 788 additions and 116 deletions

82
syn/python/flow_utils.py Normal file
View file

@ -0,0 +1,82 @@
# Copyright lowRISC contributors.
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
# SPDX-License-Identifier: Apache-2.0
import csv
import os
import re
import sys
ys_translate_script_filename = 'translate_names.ys'
ys_translated_names = 'ys_translated_names'
generated_cell_re = re.compile(r'(_\w+_)/(\w+)')
ys_tcl = './tcl/yosys_post_synth.tcl'
def create_translate_names_script(cells_to_translate, top_level, gen_out):
yosys_script_file = open(
'{}/{}'.format(gen_out, ys_translate_script_filename), 'w')
yosys_script_file.write('tcl {}\n'.format(ys_tcl))
yosys_script_file.write('cd {}\n'.format(top_level))
for cell in cells_to_translate:
yosys_script_file.write('select {} %x:+[Q]\n'.format(cell))
yosys_script_file.write('tee -a {}/{} select -list\n'.format(
gen_out, ys_translated_names))
yosys_script_file.close()
def extract_path_info(timing_csv):
timing_in = csv.reader(open(timing_csv))
cells_to_translate = set()
path_info = []
for line in timing_in:
points = []
for i in range(2):
cell_match = generated_cell_re.search(line[i])
if cell_match:
cells_to_translate.add(cell_match.group(1))
points.append(cell_match.group(1))
else:
points.append(line[i])
path_info.append((points[0], points[1], float(line[2])))
return (cells_to_translate, path_info)
def build_translated_names_dict(translated_names_file):
translated_names = open(translated_names_file)
translated_name_lines = translated_names.readlines()
translated_names_dict = {}
for i in range(0, len(translated_name_lines), 2):
translated_name = translated_name_lines[i][:-1].split('/', 1)[1]
cell_name = translated_name_lines[i + 1][:-1].split('/', 1)[1]
translated_names_dict[cell_name] = translated_name
return translated_names_dict
def translate_path_info(path_info, translated_names_file):
translated_names_dict = build_translated_names_dict(translated_names_file)
new_path_info = []
for path in path_info:
translated_path = list(path)
points = path[0:1]
for i in range(2):
if path[i] in translated_names_dict:
translated_path[i] = translated_names_dict[path[i]]
new_path_info.append(tuple(translated_path))
return new_path_info