mirror of
https://github.com/openhwgroup/cve2.git
synced 2025-04-22 04:57:25 -04:00
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.
82 lines
2.4 KiB
Python
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
|