package synthesijer.tools.xilinx; import java.io.File; import java.io.PrintStream; import java.util.ArrayList; import synthesijer.hdl.HDLInstance; import synthesijer.hdl.HDLModule; import synthesijer.hdl.HDLPort; import synthesijer.hdl.HDLPrimitiveType; import synthesijer.hdl.HDLSignalBinding; import synthesijer.hdl.HDLType; public class HDLModuleToComponentXML { private static String dir(HDLPort.DIR d){ switch(d){ case IN: return "in"; case OUT: return "out"; case INOUT: return "inout"; default: throw new RuntimeException("Unknown port DIR:" + d); } } private static String type(HDLType type){ if(type.isBit()){ return "std_logic"; }else if(type.isInteger()){ return "integer"; }else if(type.isSigned()){ return "signed"; }else{ return "std_logic_vector"; } } public static void listOfRequires(HDLModule m, ArrayList<HDLModule> list){ if(list.contains(m)) return; list.add(m); if(m.getModuleInstances().length == 0) return; for(HDLInstance inst: m.getModuleInstances()){ listOfRequires(inst.getSubModule(), list); } } public static ArrayList<HDLModule> listOfRequires(HDLModule m){ ArrayList<HDLModule> list = new ArrayList<>(); for(HDLInstance inst: m.getModuleInstances()){ listOfRequires(inst.getSubModule(), list); } return list; } public static void conv(HDLModule module, String[] libs, String vendor, String lib){ ArrayList<PortInfo> list = new ArrayList<>(); HDLPort[] ports = module.getPorts(); for(HDLPort p: ports){ PortInfo info; if(p.getType().isVector()){ int width = ((HDLPrimitiveType)p.getType()).getWidth(); info = new PortInfo(p.getName(), dir(p.getDir()), type(p.getType()), true, width-1, 0); }else{ info = new PortInfo(p.getName(), dir(p.getDir()), type(p.getType())); } list.add(info); } ArrayList<String> src = new ArrayList<>(); if(libs != null){ for(String s: libs) src.add(s); } ArrayList<HDLModule> requires = listOfRequires(module); for(HDLModule m: requires){ src.add("src/" + m.getName() + ".vhd"); } src.add("src/" + module.getName() + ".vhd"); ArrayList<HDLSignalBinding> bindings = new ArrayList<>(); for(HDLPort p: module.getPorts()){ if(p.isBinded()){ HDLSignalBinding b = p.getSignalBinding(); if(bindings.contains(b) == false) bindings.add(b); } } GenComponentXML o = new GenComponentXML(vendor, lib, module.getName(), 1, 0, list.toArray(new PortInfo[0]), src.toArray(new String[0]), bindings.toArray(new HDLSignalBinding[0])); File basedir = new File(o.getCoreUniqName()); basedir.mkdir(); File file = new File(basedir, "component.xml"); o.write(file); File srcdir = new File(basedir, "src"); srcdir.mkdir(); File xguidir = new File(basedir, "xgui"); xguidir.mkdir(); try(PrintStream xgui = new PrintStream(new File(xguidir, o.getCoreUniqName() + ".tcl"))){ xgui.println("# Definitional proc to organize widgets for parameters."); xgui.println("proc init_gui { IPINST } {"); xgui.println(" set Page0 [ipgui::add_page $IPINST -name \"Page 0\" -layout vertical]"); xgui.println(" set Component_Name [ipgui::add_param $IPINST -parent $Page0 -name Component_Name]"); xgui.println("}"); }catch(Exception e){ throw new RuntimeException(e); } } }