import os import subprocess import build_env import sys import traceback from nxpython import * artifact_path = "" # Evaluate whether we want the user to provide a selection of files def makeProject(library: str, project_name: str, path): # Create an Impulse project and add all VHDL files to it print(path) #Createproject enters the implicitly created directory print(f"Creating project \'{project_name}\'\n") getProject().setTopCellName(library, project_name) getProject().setVariantName("NG-MEDIUM", "LGA-625") getProject().addParameters({}) print(path) listed = list(os.listdir(path)) files = list(filter(lambda x: ".vhdl" in x or ".vhd" in x or ".v\0" in x, listed)) # Find VHDL and Verilog files files = list(map(lambda x: os.path.join(path, x), files)) print(f"Adding the following files to project: {files}\n") getProject().addFiles(files) print("Saving project") getProject().save(os.path.join(artifact_path, project_name + ".nym")) return 0 # Do we want the user to specify how far they want to progress wach step? What does the number mean? def synthDesign(library: str, project_name: str, path): # Synthesize the design of the project of the provided `project_name` print("Starting synthesis\n") try: nymFile = os.path.join(artifact_path, project_name + ".nym") os.lstat(nymFile) getProject().loadNative(nymFile) except: print("No existing project found, creating new project\n") makeProject(library, project_name, path) getProject().loadNative(os.path.join(artifact_path, project_name + ".nym")) getProject().progress("Synthesize", 3) getProject().save(os.path.join(artifact_path, project_name + "-synth.nym")) return 0 def placeDesign(library: str, project_name: str, path): # Place the given design. Will use a previously synthesized project if available, otherwise one will be created. print("Starting place\n") try: nymFile = os.path.join(artifact_path, project_name + "-synth.nym") os.lstat(nymFile) getProject().load(nymFile) except: print("No existing synthesis found, entering synthesis stage\n") synthDesign(library, project_name, path) getProject().load(os.path.join(artifact_path, project_name + "-synth.nym")) getProject().progress("Place", 5) getProject().save(os.path.join(artifact_path, project_name + "-place.nym")) def routeDesign(library: str, project_name: str, path): # Route the given design. Will use a previously placed project if available, otherwise one will be created. print("Starting route\n") try: nymFile = os.path.join(artifact_path, project_name + "-place.nym") os.lstat(nymFile) getProject().load(nymFile) except: print("No existing place found, entering place stage\n") placeDesign(library, project_name, path) getProject().load(os.path.join(artifact_path, project_name + "-place.nym")) getProject().progress("Route", 3) getProject().save(os.path.join(artifact_path, project_name + "-route.nym")) if __name__ == "__main__": path = os.getcwd() artifact_path = os.path.join(path, "syn") print(f"Calling {sys.argv[1]}() with arguments {sys.argv[2]}, {sys.argv[3]}") createProject(artifact_path) globals()[sys.argv[1]](sys.argv[2], sys.argv[3], path) getProject().createAnalyzer() getProject().getAnalyzer().launch(conditions="worstcase", maximumSlack=0, searchPathsLimit=10, synthesisMode=False)