Files
remotesyn/remotesyn/toolchains/xsim.py
2022-09-05 18:40:03 +02:00

167 lines
6.2 KiB
Python

import shutil
import os
import time
import subprocess
def do(config, target, log, subprocesses, prefix='.'):
shutil.rmtree(config.get('project', 'build_dir', fallback='build'), True)
log("Starting simulation")
log(" - parsing options")
toplevel = config.get(f'target.{target}', 'toplevel', fallback='toplevel')
runtime = config.get(f'target.{target}', 'runtime', fallback='100 ns')
xelab_opts = config.get(f'target.{target}', 'xelab_opts', fallback='')
files_vhdl = config.get(f'target.{target}', 'files_vhdl', fallback='').split()
files_verilog = config.get(f'target.{target}', 'files_verilog', fallback='').split()
files_sysverilog = config.get(f'target.{target}', 'files_sysverilog', fallback='').split()
files_xci = config.get(f'target.{target}', 'files_xci', fallback='').split()
files_other = config.get(f'target.{target}', 'files_other', fallback='').split()
build_dir = config.get(f'project', 'build_dir', fallback='build')
out_dir = config.get(f'project', 'out_dir', fallback='out')
prefix = f'{os.getcwd()}/{prefix}'
build_dir = f'{prefix}/{build_dir}'
out_dir = f'{prefix}/{out_dir}/{target}'
xelab_opts = xelab_opts.replace('\n', ' ')
log(" - creating output directories")
os.makedirs(build_dir, exist_ok=True)
os.makedirs(out_dir, exist_ok=True)
log(" - writing project tcl file")
with open(f'{build_dir}/do.tcl', 'w') as f:
f.write('set_param general.maxThreads 8\n')
f.write(f'create_project -force sim sim\n')
for s in files_vhdl:
f.write(f"add_files -norecurse -scan_for_includes \"{prefix}/{s}\"\n")
f.write(f"import_files -norecurse \"{prefix}/{s}\"\n")
for s in files_verilog:
f.write(f"add_files -norecurse -scan_for_includes \"{prefix}/{s}\"\n")
f.write(f"import_files -norecurse \"{prefix}/{s}\"\n")
for s in files_sysverilog:
f.write(f"add_files -norecurse -scan_for_includes \"{prefix}/{s}\"\n")
f.write(f"import_files -norecurse \"{prefix}/{s}\"\n")
for s in files_xci:
f.write(f"add_files -norecurse -scan_for_includes \"{prefix}/{s}\"\n")
for s in files_other:
f.write(f"add_files -norecurse -scan_for_includes \"{prefix}/{s}\"\n")
f.write(f"import_files -norecurse \"{prefix}/{s}\"\n")
# TODO C files for VPI
f.write(f"set_property top {toplevel} [get_filesets sim_1]\n")
f.write("set_property top_lib xil_defaultlib [get_filesets sim_1]\n")
f.write("launch_simulation -noclean_dir -scripts_only -absolute_path\n")
log(" - run vivado")
p = subprocess.Popen(f"vivado -mode batch -source do.tcl",
shell=True, cwd=build_dir,
stdin=subprocess.DEVNULL, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
subprocesses.append(p)
while p.poll() is None:
time.sleep(1)
res = p.returncode
log(" - copy logs")
shutil.copy(f'{build_dir}/vivado.log', f'{out_dir}/synth.log')
if res!=0:
log("ERROR: vivado returned with", res)
return res
log(" - patch run scripts")
p = subprocess.Popen(f'sed -i "s/xelab/xelab {xelab_opts}/g" elaborate.sh',
shell=True, cwd=f'{build_dir}/sim/sim.sim/sim_1/behav/xsim',
stdin=subprocess.DEVNULL, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
subprocesses.append(p)
while p.poll() is None:
time.sleep(1)
res = p.returncode
if res!=0:
log("ERROR: patch returned with", res)
return res
log(" - copy other files to simulation environment")
for f in files_other:
shutil.copy(f'{prefix}/{f}', f'{build_dir}/sim/sim.sim/sim_1/behav/xsim')
if f.endswith('.sdf'):
#patch sdf file
fname = f.split('/')[-1]
log(f" (patching {fname})")
p = subprocess.Popen(f"sed -i '/ \/I /d' {fname} && sed -i '/glbl.v/d' *.prj",
shell=True, cwd=f'{build_dir}/sim/sim.sim/sim_1/behav/xsim',
stdin=subprocess.DEVNULL, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
subprocesses.append(p)
while p.poll() is None:
time.sleep(1)
res = p.returncode
if res!=0:
log("ERROR: Patching went wrong...")
return res
log(" - compile")
p = subprocess.Popen(f'bash compile.sh',
shell=True, cwd=f'{build_dir}/sim/sim.sim/sim_1/behav/xsim',
stdin=subprocess.DEVNULL, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
subprocesses.append(p)
while p.poll() is None:
time.sleep(1)
res = p.returncode
log(" - copy logs")
shutil.copy(f'{build_dir}/sim/sim.sim/sim_1/behav/xsim/compile.log', f'{out_dir}/compile.log')
if res!=0:
log("ERROR: compile returned with", res)
return res
log(" - elaborate")
p = subprocess.Popen(f'bash elaborate.sh',
shell=True, cwd=f'{build_dir}/sim/sim.sim/sim_1/behav/xsim',
stdin=subprocess.DEVNULL, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
subprocesses.append(p)
while p.poll() is None:
time.sleep(1)
res = p.returncode
log(" - copy logs")
shutil.copy(f'{build_dir}/sim/sim.sim/sim_1/behav/xsim/elaborate.log', f'{out_dir}/elaborate.log')
if res!=0:
log("ERROR: elaborate returned with", res)
return res
log(" - write simulation script")
with open(f'{build_dir}/sim/sim.sim/sim_1/behav/xsim/{toplevel}.tcl', 'w') as f:
f.write(f"open_vcd out.vcd\nlog_vcd\nrun {runtime}\nclose_vcd\nquit\n")
log(" - simulate")
p = subprocess.Popen(f'bash simulate.sh',
shell=True, cwd=f'{build_dir}/sim/sim.sim/sim_1/behav/xsim',
stdin=subprocess.DEVNULL, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
subprocesses.append(p)
while p.poll() is None:
time.sleep(1)
res = p.returncode
log(" - copy logs")
shutil.copy(f'{build_dir}/sim/sim.sim/sim_1/behav/xsim/simulate.log', f'{out_dir}/simulate.log')
if res!=0:
log("ERROR: patch simulate with", res)
return res
log(" - copy output files")
shutil.copy(f'{build_dir}/sim/sim.sim/sim_1/behav/xsim/out.vcd', f'{out_dir}/out.vcd')
return res