Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adding IP Generation to the Efinity flow. #420

Open
wants to merge 3 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 62 additions & 0 deletions edalize/tools/efinity.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,26 @@ class Efinity(Edatool):
"type": "str",
"desc": "Speed grade (e.g. C4)",
},
"ip_gen": {
"type": "dict",
"desc": "IP generator",
"list": True,
},
"bitstream_gen": {
"type": "dict",
"desc": "Bitstream generator options",
"list": True,
}
}

BITSTREAM_MODES = ["active", "passive"]
BITSTREAM_FORMATS = ["bit", "bitbin", "hex", "hexbin"]
CLOCK_DIVS = ['DIV1', 'DIV4', 'DIV8']

BITSTREAM_GEN_DEFAULTS = {
"mode": "active",
"formats": ["bit", "hex"],
"clk_div": 'DIV8',
}

def setup(self, edam):
Expand All @@ -53,6 +73,21 @@ def setup(self, edam):
for i in ["family", "part", "timing"]:
if not i in self.tool_options:
raise RuntimeError("Missing required option '{}'".format(i))

for default in self.BITSTREAM_GEN_DEFAULTS:
if not default in self.tool_options['bitstream_gen']:
self.tool_options['bitstream_gen'][default] = self.BITSTREAM_GEN_DEFAULTS[default]

if not self.tool_options['bitstream_gen']['mode'] in self.BITSTREAM_MODES:
raise RuntimeError("Invalid bitstream_gen mode: {}".format(self.tool_options['bitstream_gen']['mode']))

for format in self.tool_options['bitstream_gen']['formats']:
if not format in self.BITSTREAM_FORMATS:
raise RuntimeError("Invalid bitstream_gen format: {}".format(format))

if not self.tool_options['bitstream_gen']['clk_div'] in self.CLOCK_DIVS:
raise RuntimeError("Invalid bitstream_gen clk_div: {}".format(self.tool_options['bitstream_gen']['clk_div']))


design_files = []
constr_files = []
Expand Down Expand Up @@ -124,6 +159,25 @@ def setup(self, edam):
)
dep_files.append(self.name + ".peri.xml")

# Add command to generate IP
if "ip_gen" in self.tool_options:
for ip_config in self.tool_options.get("ip_gen"):
module_name = ip_config.get("module_name")
commands.add(
[
self.efinity_python,
"gen_ip_" + module_name + ".py",
self.name,
self.tool_options.get("part"),
],
[self.name + "_" + module_name],
[],
variables={
"EFXIPM_HOME": self.efinity_home + "/ipm",
},
)
dep_files.append(self.name + "_" + module_name)

commands.add(
[
self.efinity_python,
Expand All @@ -140,6 +194,7 @@ def setup(self, edam):
"EFXPGM_HOME": self.efinity_home + "/pgm",
},
)

commands.set_default_target(bit_file)
self.commands = commands

Expand All @@ -152,3 +207,10 @@ def write_config_files(self):
if self.isf_file:
# Create XML file with IO and hard blocks definitions
self.render_template("isf_to_xml.py", "isf_to_xml.py")
if "ip_gen" in self.tool_options:
for ip_config in self.tool_options.get("ip_gen"):
self.render_template(
"gen_ip.py.j2",
"gen_ip_" + ip_config.get("module_name") + ".py",
ip_config,
)
48 changes: 48 additions & 0 deletions edalize/tools/templates/efinity/gen_ip.py.j2
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
# Get access to useful python package
import os
import sys

# Tell python where to get IP Manager's API package
ipm_home = os.environ["EFXIPM_HOME"]
sys.path.append(ipm_home + "/bin")

from efx_ipmgr import api_v2
from ipm_api_service.design import IPMDesignAPI
from ipm_api_service.projectxml import ProjectXML

name = sys.argv[1]
part = sys.argv[2]
workdir = "."

ipm = IPMDesignAPI(
device_name=part, family_name=name, project_path=workdir, is_verbose=True
)
project_xml_path = workdir + "/" + name + ".xml"
projectxml = ProjectXML(project_xml_path=project_xml_path, is_verbose=True)

module_name = "{{ module_name }}"
vendor = "{{ vendor }}"
library = "{{ library }}"
name = "{{ name }}"

ipm.create_ip(
module_name=module_name,
vendor=vendor,
library=library,
name=name,
)

configs = {
{% for k, v in config.items() %}
"{{k}}": "{{v}}",
{% endfor %}
}

ipm.config_ip(module_name=module_name, configs=configs)

success, errors, param = ipm.validate_ip(module_name=module_name)

if success:
result = ipm.generate_ip(module_name=module_name)
projectxml.add_ip(module_name=module_name)
projectxml.save()
8 changes: 6 additions & 2 deletions edalize/tools/templates/efinity/newproj_tmpl.xml.j2
Original file line number Diff line number Diff line change
Expand Up @@ -59,13 +59,13 @@
<efx:param name="load_delaym" value="on" value_type="e_bool"/>
</efx:place_and_route>
<efx:bitstream_generation tool_name="efx_pgm">
<efx:param name="mode" value="active" value_type="e_string"/>
<efx:param name="mode" value="{{tool_options.bitstream_gen.mode}}" value_type="e_string"/>
<efx:param name="width" value="1" value_type="e_string"/>
<!-- on, off, smart -->
<efx:param name="enable_roms" value="smart" value_type="e_option"/>
<efx:param name="spi_low_power_mode" value="on" value_type="e_bool"/>
<efx:param name="io_weak_pullup" value="on" value_type="e_bool"/>
<efx:param name="oscillator_clock_divider" value="DIV8" value_type="e_option"/>
<efx:param name="oscillator_clock_divider" value="{{tool_options.bitstream_gen.clk_div}}" value_type="e_option"/>
<!-- on, off -->
<efx:param name="bitstream_compression" value="on" value_type="e_bool"/>
<!-- on, off -->
Expand All @@ -75,6 +75,10 @@
<efx:param name="jtag_usercode" value="0xFFFFFFFF" value_type="e_string"/>
<!-- on, off -->
<efx:param name="release_tri_then_reset" value="on" value_type="e_bool"/>
<!-- on, off -->
{% for k in tool_options.bitstream_gen.formats %}
<efx:param name="generate_{{k}}" value="on" value_type="e_bool"/>
{% endfor %}
</efx:bitstream_generation>
<efx:debugger>
<efx:param name="work_dir" value="work_dbg" value_type="e_string" />
Expand Down
Loading