package de.gaalop.codegen_verilog; import de.gaalop.CodeGenerator; import de.gaalop.OutputFile; import de.gaalop.cfg.ControlFlowGraph; import de.gaalop.codegen_verilog.VerilogIR.VerilogDFG; import de.gaalop.cpp.CppVisitor; import de.gaalop.optimizations.CSE.CSE_Collector; import de.gaalop.optimizations.CSE.CSE_Collector; import de.gaalop.optimizations.ConstantFolding; import de.gaalop.optimizations.ConstantKiller.ConstanKillCrawler; import de.gaalop.quadriererOptimierer.Quadopt; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.util.Set; import java.util.Collections; import java.nio.charset.Charset; import java.util.logging.Level; import java.util.logging.Logger; import org.omg.PortableInterceptor.INACTIVE; /** * This class facilitates Verilog code generation. */ public enum VerilogCodegen implements CodeGenerator { INSTANCE; @Override public Set<OutputFile> generate(ControlFlowGraph in) { String code = generateCode(in); String filename = generateFilename(in); OutputFile sourceFile = new OutputFile(filename, code, Charset.forName("UTF-8")); return Collections.singleton(sourceFile); } private String generateFilename(ControlFlowGraph in) { String filename = "gaalop"; if (in.getSource() != null) { filename = in.getSource().getName(); int lastDotIndex = filename.lastIndexOf('.'); if (lastDotIndex != -1) { filename = filename.substring(0, lastDotIndex); } filename += ".v"; } return filename; } /** * Generates source code for a control dataflow graph. * * @param in * @return */ private String generateCode(ControlFlowGraph in) { CppVisitor cpp = new CppVisitor(true); in.accept(cpp); try { BufferedWriter w = new BufferedWriter(new FileWriter("original.cpp")); w.write(cpp.getCode()); w.flush(); w.close(); } catch (IOException ex) { Logger.getLogger(VerilogCodegen.class.getName()).log(Level.SEVERE, null, ex); } ConstantFolding cf = new ConstantFolding(); in.accept(cf); for(int i=0;i<20;++i) { in.accept(new ConstanKillCrawler()); in.accept(new ConstantFolding()); } // to start CSE remove the comments on the following line remove quadopt instead in.accept(new CSE_Collector()); in.accept(new CSE_Collector()); //in.accept(new Quadopt()); // cpp = new CppVisitor(); // in.accept(cpp); try { BufferedWriter w = new BufferedWriter(new FileWriter("junk.cpp")); w.write(cpp.getCode()); w.flush(); w.close(); } catch (IOException ex) { Logger.getLogger(VerilogCodegen.class.getName()).log(Level.SEVERE, null, ex); } VerilogDFG mydfg = new VerilogDFG(in); // different steps //todo IR conversion //restructuring of Tree // leveling of tree // floating point conversion // code generation System.out.println(in.toString()); // Old Code //VerilogVisitor visitor = new VerilogVisitor(); //in.accept(visitor); //return visitor.getCode(); return mydfg.getIrvisit().getResult(); } }