File: synth_run.py

package info (click to toggle)
uhd 3.13.1.0-3
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 207,120 kB
  • sloc: cpp: 167,245; ansic: 86,841; vhdl: 53,420; python: 40,839; xml: 13,167; tcl: 5,688; makefile: 2,167; sh: 1,719; pascal: 230; csh: 94; asm: 20; perl: 11
file content (67 lines) | stat: -rw-r--r-- 2,580 bytes parent folder | download | duplicates (2)
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')