Source code for hwtBuildsystem.quartus.api.project
import os
from pathlib import Path
from hwtBuildsystem.common.project import SynthesisToolProject
from hwtBuildsystem.quartus.part import IntelPart
from hwtBuildsystem.quartus.report import QuartusReport
[docs]class QuartusProject(SynthesisToolProject):
"""
:attention: After project is opened the currend directory is changed to
"""
SUFFIX_TO_FILE_TYPE = {
".v": "VERILOG_FILE",
".vhd": "VHDL_FILE",
".vh": "VERILOG_INCLUDE_FILE",
".svh": "VERILOG_INCLUDE_FILE",
".sv": "SYSTEMVERILOG_FILE",
".sdc": "SDC_FILE",
".ip": "IP_FILE",
}
def __init__(self, executor: "QuartusExecutor", path:str, name:str):
super(QuartusProject, self).__init__(executor, path, name)
self.name = name
# j = os.path.join
# self.projFile = j(path, name, name + ".xpr")
self._report = QuartusReport(self.path, self.name, None)
def _defaultTclImports(self):
exe = self.executor.exeCmd
exe(f'package require ::quartus::project')
exe(f'package require ::quartus::flow')
[docs] def setPart(self, part: IntelPart):
"""
:param part: tuple family, part number e.g ("Cyclone", "EP1C12F256C6")
"""
self.part = part
exe = self.executor.exeCmd
exe(f'set_global_assignment -name FAMILY "{part.family:s}"')
exe(f'set_global_assignment -name DEVICE {part.device:s}')
[docs] def setTop(self, topName):
self.top = topName
self._report.topName = topName
exe = self.executor.exeCmd
exe(f'set_global_assignment -name TOP_LEVEL_ENTITY {self.top:s}')
[docs] def create(self):
# https://www.intel.com/content/www/us/en/programmable/documentation/jeb1529967983176.html#mwh1410471006061
os.makedirs(self.path, exist_ok=True)
exe = self.executor.exeCmd
exe(f'cd "{self.path:s}"')
exe(f'project_new {self.name:s} -overwrite')
if self.executor.workerCnt is not None:
exe(f"set_global_assignment -name num_parallel_processors {self.executor.workerCnt:d}")
exe(f'project_open {self.name:s}')
[docs] def addConstrainFiles(self, files):
exe = self.executor.exeCmd
for f in files:
exe(f"set_global_assignment -name SDC_FILE '{f:s}'")
[docs] def addFiles(self, files):
# https://www.intel.com/content/www/us/en/programmable/documentation/eca1490998903550.html#mnl1088
exe = self.executor.exeCmd
for f in files:
suffix = os.path.splitext(f)[1].lower()
t = self.SUFFIX_TO_FILE_TYPE[suffix]
f = str(Path(f).relative_to(self.path))
if suffix == ".vhd":
lib = "work"
exe('set_global_assignment -name VHDL_INPUT_VERSION VHDL_2008')
exe(f'set_global_assignment -name {t:s} "{f:s}" -hdl_version VHDL_2008 -library {lib:s}')
else:
exe(f'set_global_assignment -name {t:s} "{f:s}"')
[docs] def synthAll(self):
assert self.top is not None
self._defaultTclImports()
exe = self.executor.exeCmd
exe(f'execute_module -tool ipg')
exe(f'execute_module -tool map')
self._report.setSynthFileNames()
[docs] def implemAll(self):
self._defaultTclImports()
exe = self.executor.exeCmd
exe(f'execute_module -tool fit')
exe(f'execute_module -tool sta')
self._report.setImplFileNames()
[docs] def writeBitstream(self):
self._defaultTclImports()
exe = self.executor.exeCmd
exe('execute_module -tool asm')
self._report.setBitstreamFileName()
[docs] def close(self):
exe = self.executor.exeCmd
exe('project_close')