Added task support for modelsim script

This commit is contained in:
Ganesh Gore 2019-11-15 23:23:15 -07:00
parent 1c4acff79b
commit f05aede868
2 changed files with 76 additions and 10 deletions

View File

@ -47,7 +47,7 @@ proc top_create_new_project {projectname verilog_files modelsim_path simtime uni
#Start the simulation #Start the simulation
vsim $projectname.$top_tb -voptargs=+acc vsim $projectname.$top_tb -voptargs=+acc
#Add the waves #Add the waves
add_waves top_tb add_waves $top_tb
#run the simulation #run the simulation
runsim $simtime $unit runsim $simtime $unit
#Fit the window view #Fit the window view

View File

@ -1,12 +1,12 @@
from string import Template from string import Template
import sys import sys
import os import os
import pprint import re
import glob
import argparse import argparse
import subprocess import subprocess
import logging import logging
from pprint import pprint from configparser import ConfigParser, ExtendedInterpolation
from configparser import ConfigParser
# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = # = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
# Configure logging system # Configure logging system
@ -20,7 +20,8 @@ logger = logging.getLogger('Modelsim_run_log')
# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = # = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
parser.add_argument('files', nargs='+', parser.add_argument('files', nargs='+',
help="Pass SimulationDeckInfo generated by OpenFPGA flow") help="Pass SimulationDeckInfo generated by OpenFPGA flow" +
" or pass taskname <taskname> <run_number[optional]>")
parser.add_argument('--modelsim_proc_tmpl', type=str, parser.add_argument('--modelsim_proc_tmpl', type=str,
help="Modelsim proc template file") help="Modelsim proc template file")
parser.add_argument('--modelsim_runsim_tmpl', type=str, parser.add_argument('--modelsim_runsim_tmpl', type=str,
@ -36,9 +37,32 @@ parser.add_argument('--modelsim_ini', type=str,
help="Skip any confirmation") help="Skip any confirmation")
parser.add_argument('--skip_prompt', action='store_true', parser.add_argument('--skip_prompt', action='store_true',
help='Skip any confirmation') help='Skip any confirmation')
parser.add_argument('--ini_filename', type=str,
default="simulation_deck_info.ini",
help='default INI filename in in fun dir')
args = parser.parse_args() args = parser.parse_args()
# Consider default formality script template # = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
# Read script configuration file
# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
task_script_dir = os.path.dirname(os.path.abspath(__file__))
script_env_vars = ({"PATH": {
"OPENFPGA_FLOW_PATH": task_script_dir,
"ARCH_PATH": os.path.join("${PATH:OPENFPGA_PATH}", "arch"),
"BENCH_PATH": os.path.join("${PATH:OPENFPGA_PATH}", "benchmarks"),
"TECH_PATH": os.path.join("${PATH:OPENFPGA_PATH}", "tech"),
"SPICENETLIST_PATH": os.path.join("${PATH:OPENFPGA_PATH}", "SpiceNetlists"),
"VERILOG_PATH": os.path.join("${PATH:OPENFPGA_PATH}", "VerilogNetlists"),
"OPENFPGA_PATH": os.path.abspath(os.path.join(task_script_dir, os.pardir,
os.pardir))}})
config = ConfigParser(interpolation=ExtendedInterpolation())
config.read_dict(script_env_vars)
config.read_file(open(os.path.join(task_script_dir, 'run_fpga_task.conf')))
gc = config["GENERAL CONFIGURATION"]
# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
# Load default templates for modelsim
# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
task_script_dir = os.path.dirname(os.path.abspath(__file__)) task_script_dir = os.path.dirname(os.path.abspath(__file__))
if not args.modelsim_proc_tmpl: if not args.modelsim_proc_tmpl:
args.modelsim_proc_tmpl = os.path.join(task_script_dir, os.pardir, args.modelsim_proc_tmpl = os.path.join(task_script_dir, os.pardir,
@ -52,7 +76,49 @@ args.modelsim_runsim_tmpl = os.path.abspath(args.modelsim_runsim_tmpl)
def main(): def main():
for eachFile in args.files: if os.path.isfile(args.files[0]):
run_modelsim(args.files)
else:
# Check if task directory exists and consistent
taskname = args.files[0]
task_run = "latest"
if len(args.files) > 1:
task_run = f"run{int(args.files[1]):03}"
temp_dir = os.path.join(gc["task_dir"], taskname)
if not os.path.isdir(temp_dir):
clean_up_and_exit("Task directory [%s] not found" % temp_dir)
temp_dir = os.path.join(gc["task_dir"], taskname, task_run)
if not os.path.isdir(temp_dir):
clean_up_and_exit("Task run directory [%s] not found" % temp_dir)
logfile = os.path.join(gc["task_dir"], taskname, task_run, "*.log")
logfiles = glob.glob(logfile)
if not len(logfiles):
clean_up_and_exit("No successful run found in [%s]" % temp_dir)
task_ini_files = []
for eachfile in logfiles:
with open(eachfile) as fp:
run_dir = [re.findall(r'^INFO.*Run directory : (.*)$', line)
for line in open(eachfile)]
run_dir = filter(bool, run_dir)
for each_run in run_dir:
INIfile = os.path.join(each_run[0], args.ini_filename)
if os.path.isfile(INIfile):
task_ini_files.append(INIfile)
logger.info(f"Found {len(task_ini_files)} INI files")
run_modelsim(task_ini_files)
def clean_up_and_exit(msg):
logger.error(msg)
logger.error("Exiting . . . . . .")
exit(1)
def run_modelsim(files):
for eachFile in files:
eachFile = os.path.abspath(eachFile) eachFile = os.path.abspath(eachFile)
pDir = os.path.dirname(eachFile) pDir = os.path.dirname(eachFile)
os.chdir(pDir) os.chdir(pDir)
@ -111,10 +177,10 @@ def main():
# Execute modelsim # Execute modelsim
if args.run_sim: if args.run_sim:
os.chdir(args.modelsim_run_dir) os.chdir(args.modelsim_run_dir)
print(args.modelsim_run_dir)
modelsim_run_cmd = ["vsim", "-c", "-do", runsim_filename] modelsim_run_cmd = ["vsim", "-c", "-do", runsim_filename]
run_command("ModelSim Run", "modelsim_run.log", out = run_command("ModelSim Run", "modelsim_run.log",
modelsim_run_cmd) modelsim_run_cmd)
logger.info(re.findall(r"(.*Errors.*Warning.*)", out))
else: else:
logger.info("Created runsim and proc files") logger.info("Created runsim and proc files")
logger.info(f"runsim_filename {runsim_filename}") logger.info(f"runsim_filename {runsim_filename}")