cve2/syn/python/flow_utils.py
Greg Chadwick 79bb6c7832 [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.
2020-01-07 14:09:17 +00:00

82 lines
2.4 KiB
Python

# 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