mirror of
https://github.com/lowRISC/ibex.git
synced 2025-04-25 14:27:33 -04:00
[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:
parent
9c6ddae626
commit
79bb6c7832
22 changed files with 788 additions and 116 deletions
82
syn/python/flow_utils.py
Normal file
82
syn/python/flow_utils.py
Normal 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
|
Loading…
Add table
Add a link
Reference in a new issue