1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
|
#! /usr/bin/python3
#!/usr/bin/python3
#
# Copyright 2018 Ettus Research, a National Instruments Company
#
# SPDX-License-Identifier: LGPL-3.0-or-later
#
import sys, os
import subprocess
import re
def synth_run(modname, keys, transform):
prefix = modname + '_' + ('_'.join(['%s%s'%(k,transform[k]) for k in keys]))
print('='*(len(prefix)+2))
print(' %s '%(prefix))
print('='*(len(prefix)+2))
# Write Verilog top-level file
with open(modname + '_top.v.in', 'r') as in_file:
with open(modname + '_top.v', 'w') as out_file:
out_file.write(in_file.read().format(**transform))
# Run Vivado
exitcode = subprocess.Popen(
'vivado -mode tcl -source %s_top.tcl -nolog -nojou'%(modname), shell=True
).wait()
if exitcode != 0:
raise RuntimeError('Error running vivado. Was setupenv.sh run?')
# Extract info
lut = 100.0
reg = 100.0
bram = 100.0
dsp = 100.0
fmax = 0.0
with open(modname + '.rpt', 'r') as rpt_file:
rpt = rpt_file.readlines()
for line in rpt:
lm = re.match(r'.*Slice LUTs\*.*\|(.*)\|(.*)\|(.*)\|.*', line)
if lm is not None:
lut = float(lm.group(3).strip())
rm = re.match(r'.*Slice Registers.*\|(.*)\|(.*)\|(.*)\|.*', line)
if rm is not None:
reg = float(rm.group(3).strip())
bm = re.match(r'.*Block RAM Tile.*\|(.*)\|(.*)\|(.*)\|.*', line)
if bm is not None:
bram = float(bm.group(3).strip())
dm = re.match(r'.*DSPs.*\|(.*)\|(.*)\|(.*)\|.*', line)
if dm is not None:
dsp = float(dm.group(3).strip())
tm = re.match(r'.*clk.*\| clk\s*\|(.*)\|.*\|.*\|.*\|.*\|.*\|.*\|.*\|', line)
if tm is not None:
fmax = 1000.0/float(tm.group(1).strip())
# Save report
os.rename(modname + '.rpt', prefix + '.rpt')
os.rename(modname + '.dcp', prefix + '.dcp')
try:
os.remove(modname + '_top.v')
os.remove('fsm_encoding.os')
except FileNotFoundError:
pass
# Write summary report line
res_keys = ['lut','reg','bram','dsp','fmax']
res = {'lut':lut, 'reg':reg, 'bram':bram, 'dsp':dsp, 'fmax':fmax, 'prefix':prefix}
if not os.path.exists(modname + '_summary.csv'):
with open(modname + '_summary.csv', 'w') as summaryf:
summaryf.write((','.join(keys + res_keys)) + '\n')
with open(modname + '_summary.csv', 'a') as summaryf:
summaryf.write((','.join(['%s'%(transform[k]) for k in keys])) + ',' + (','.join(['%.1f'%(res[k]) for k in res_keys])) + '\n')
|