build/efinix/efinity: Switch to direct call of efx_map/pnr/pgm and add family parameter.

This commit is contained in:
Florent Kermarrec 2021-11-11 10:04:21 +01:00
parent a89772f087
commit a5356f78c3
1 changed files with 90 additions and 89 deletions

View File

@ -169,7 +169,7 @@ def _build_peri(efinity_path, build_name, partnumber, named_sc, named_pc, fragme
# Project configuration ------------------------------------------------------------------------ # Project configuration ------------------------------------------------------------------------
def _build_xml(partnumber, timing_model, build_name, sources, additional_xml_commands): def _build_xml(family, device, timing_model, build_name, sources, additional_xml_commands):
root = et.Element('efx:project') root = et.Element('efx:project')
@ -194,8 +194,8 @@ def _build_xml(partnumber, timing_model, build_name, sources, additional_xml_com
root.attrib['xsi:schemaLocation'] = 'http://www.efinixinc.com/enf_proj enf_proj.xsd' root.attrib['xsi:schemaLocation'] = 'http://www.efinixinc.com/enf_proj enf_proj.xsd'
device_info = et.SubElement(root, 'efx:device_info') device_info = et.SubElement(root, 'efx:device_info')
et.SubElement(device_info, 'efx:family', name = 'Trion') et.SubElement(device_info, 'efx:family', name = family)
et.SubElement(device_info, 'efx:device', name = partnumber) et.SubElement(device_info, 'efx:device', name = device)
et.SubElement(device_info, 'efx:timing_model', name = timing_model) et.SubElement(device_info, 'efx:timing_model', name = timing_model)
design_info = et.SubElement(root, 'efx:design_info') design_info = et.SubElement(root, 'efx:design_info')
@ -261,6 +261,8 @@ class EfinityToolchain:
run = True, run = True,
**kwargs): **kwargs):
family = "Trion" # FIXME: Add Titanium support.
self.ifacewriter.set_build_params(platform, build_name) self.ifacewriter.set_build_params(platform, build_name)
# Create build directory # Create build directory
@ -295,15 +297,18 @@ class EfinityToolchain:
vns = v_output.ns, vns = v_output.ns,
named_sc = named_sc, named_sc = named_sc,
build_name = build_name, build_name = build_name,
additional_sdc_commands = self.additional_sdc_commands) additional_sdc_commands = self.additional_sdc_commands,
)
# Generate project file (.xml) # Generate project file (.xml)
_build_xml( _build_xml(
partnumber = platform.device, family = family,
device = platform.device,
timing_model = platform.timing_model, timing_model = platform.timing_model,
build_name = build_name, build_name = build_name,
sources = platform.sources, sources = platform.sources,
additional_xml_commands = self.additional_xml_commands) additional_xml_commands = self.additional_xml_commands,
)
# Generate constraints file (.peri.xml) # Generate constraints file (.peri.xml)
_build_peri( _build_peri(
@ -315,7 +320,8 @@ class EfinityToolchain:
fragment = fragment, fragment = fragment,
platform = platform, platform = platform,
additional_iface_commands = self.additional_iface_commands, additional_iface_commands = self.additional_iface_commands,
excluded_ios = self.excluded_ios) excluded_ios = self.excluded_ios,
)
# DDR doesn't have Python API so we need to configure it # DDR doesn't have Python API so we need to configure it
# directly in the peri.xml file # directly in the peri.xml file
@ -324,91 +330,86 @@ class EfinityToolchain:
# Run # Run
if run: if run:
if True: # FIXME: Keep efx_run for now as default. # Synthesis/Mapping.
if subprocess.call([self.efinity_path + '/scripts/efx_run.py', build_name + '.xml', '-f', 'compile']) != 0: r = subprocess.call([self.efinity_path + "/bin/efx_map",
raise OSError("Error occurred during efx_run script execution.") "--project", f"{build_name}",
else: "--root", f"{build_name}",
# Synthesis/Mapping. "--write-efx-verilog", f"outflow/{build_name}.map.v",
r = subprocess.call([self.efinity_path + "/bin/efx_map", "--write-premap-module", f"outflow/{build_name}.elab.vdb",
"--project", f"{build_name}", "--binary-db", f"{build_name}.vdb",
"--root", f"{build_name}", "--family", family,
"--write-efx-verilog", f"outflow/{build_name}.map.v", "--device", platform.device,
"--write-premap-module", f"outflow/{build_name}.elab.vdb", "--mode", "speed",
"--binary-db", f"{build_name}.vdb", "--max_ram", "-1",
"--family", "Trion", "--max_mult", "-1",
"--device", platform.device, "--infer-clk-enable", "3",
"--mode", "speed", "--infer-sync-set-reset", "1",
"--max_ram", "-1", "--fanout-limit", "0",
"--max_mult", "-1", "--bram_output_regs_packing", "1",
"--infer-clk-enable", "3", "--retiming", "1",
"--infer-sync-set-reset", "1", "--seq_opt", "1",
"--fanout-limit", "0", "--blast_const_operand_adders", "1",
"--bram_output_regs_packing", "1", "--mult_input_regs_packing", "1",
"--retiming", "1", "--mult_output_regs_packing", "1",
"--seq_opt", "1", "--veri_option", "verilog_mode=verilog_2k,vhdl_mode=vhdl_2008",
"--blast_const_operand_adders", "1", "--work-dir", "work_syn",
"--mult_input_regs_packing", "1", "--output-dir", "outflow",
"--mult_output_regs_packing", "1", "--project-xml", f"{build_name}.xml",
"--veri_option", "verilog_mode=verilog_2k,vhdl_mode=vhdl_2008", "--I", "./"
"--work-dir", "work_syn", ])
"--output-dir", "outflow", if r != 0:
"--project-xml", f"{build_name}.xml", raise OSError("Error occurred during efx_map execution.")
"--I", "./"
])
if r != 0:
raise OSError("Error occurred during efx_map execution.")
# Place and Route. # Place and Route.
r = subprocess.call([self.efinity_path + "/bin/python3", r = subprocess.call([self.efinity_path + "/bin/python3",
self.efinity_path + "/scripts/efx_run_pt.py", self.efinity_path + "/scripts/efx_run_pt.py",
f"{build_name}", f"{build_name}",
"Trion", family,
platform.device platform.device
]) ])
if r != 0: if r != 0:
raise OSError("Error occurred during efx_run_pt execution.") raise OSError("Error occurred during efx_run_pt execution.")
r = subprocess.call([self.efinity_path + "/bin/efx_pnr", r = subprocess.call([self.efinity_path + "/bin/efx_pnr",
"--circuit", f"{build_name}", "--circuit", f"{build_name}",
"--family", "Trion", "--family", family,
"--device", platform.device, "--device", platform.device,
"--operating_conditions", platform.timing_model, "--operating_conditions", platform.timing_model,
"--pack", "--pack",
"--place", "--place",
"--route", "--route",
"--vdb_file", f"work_syn/{build_name}.vdb", "--vdb_file", f"work_syn/{build_name}.vdb",
"--use_vdb_file", "on", "--use_vdb_file", "on",
"--place_file", f"outflow/{build_name}.place", "--place_file", f"outflow/{build_name}.place",
"--route_file", f"outflow/{build_name}.route", "--route_file", f"outflow/{build_name}.route",
"--sdc_file", f"{build_name}.sdc", "--sdc_file", f"{build_name}.sdc",
#"--sync_file", f"{build_name}.csv", # FIXME. "--sync_file", f"outflow/{build_name}.interface.csv",
"--seed", "1", "--seed", "1",
"--work_dir", "work_pnr", "--work_dir", "work_pnr",
"--output_dir", "outflow", "--output_dir", "outflow",
"--timing_analysis", "on", "--timing_analysis", "on",
"--load_delay_matrix" "--load_delay_matrix"
]) ])
if r != 0: if r != 0:
raise OSError("Error occurred during efx_pnr execution.") raise OSError("Error occurred during efx_pnr execution.")
# Bitstream. # Bitstream.
r = subprocess.call([self.efinity_path + "/bin/efx_pgm", r = subprocess.call([self.efinity_path + "/bin/efx_pgm",
"--source", f"work_pnr/{build_name}.lbf", "--source", f"work_pnr/{build_name}.lbf",
"--dest", f"outflow/{build_name}.hex", "--dest", f"outflow/{build_name}.hex",
"--device", platform.device, "--device", platform.device,
"--family", "Trion", "--family", family,
"--periph", f"outflow/{build_name}.lpf", "--periph", f"outflow/{build_name}.lpf",
"--interface_designer_settings", f"outflow/{build_name}_or.ini", "--oscillator_clock_divider", "DIV8",
"--oscillator_clock_divider", "DIV8", "--spi_low_power_mode", "off",
"--spi_low_power_mode", "off", "--io_weak_pullup", "on",
"--io_weak_pullup", "on", "--enable_roms", "on",
"--enable_roms", "on", "--mode", "active",
"--mode", "active", "--width", "1",
"--width", "1", "--enable_crc_check", "on"
"--enable_crc_check", "on" ])
]) if r != 0:
if r != 0: raise OSError("Error occurred during efx_pgm execution.")
raise OSError("Error occurred during efx_pgm execution.")
os.chdir(cwd) os.chdir(cwd)