Merge pull request #1862 from boqwxp/cleanup_techmap
[yosys.git] / techlibs / greenpak4 / synth_greenpak4.cc
index 10db06cd130b4bd148b4dec0a281aad4dbda7bbe..bfbb56d15d129f2a4aec0ebd4eacc778ff118ba3 100644 (file)
@@ -29,13 +29,15 @@ struct SynthGreenPAK4Pass : public ScriptPass
 {
        SynthGreenPAK4Pass() : ScriptPass("synth_greenpak4", "synthesis for GreenPAK4 FPGAs") { }
 
-       virtual void help() YS_OVERRIDE
+       void help() YS_OVERRIDE
        {
                //   |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
                log("\n");
                log("    synth_greenpak4 [options]\n");
                log("\n");
                log("This command runs synthesis for GreenPAK4 FPGAs. This work is experimental.\n");
+               log("It is intended to be used with https://github.com/azonenberg/openfpga as the\n");
+               log("place-and-route.\n");
                log("\n");
                log("    -top <module>\n");
                log("        use the specified module as top module (default='top')\n");
@@ -57,7 +59,7 @@ struct SynthGreenPAK4Pass : public ScriptPass
                log("        do not flatten design before synthesis\n");
                log("\n");
                log("    -retime\n");
-               log("        run 'abc' with -dff option\n");
+               log("        run 'abc' with '-dff -D 1' options\n");
                log("\n");
                log("\n");
                log("The following commands are executed by this synthesis command:\n");
@@ -68,7 +70,7 @@ struct SynthGreenPAK4Pass : public ScriptPass
        string top_opt, part, json_file;
        bool flatten, retime;
 
-       virtual void clear_flags() YS_OVERRIDE
+       void clear_flags() YS_OVERRIDE
        {
                top_opt = "-auto-top";
                part = "SLG46621V";
@@ -77,7 +79,7 @@ struct SynthGreenPAK4Pass : public ScriptPass
                retime = false;
        }
 
-       virtual void execute(std::vector<std::string> args, RTLIL::Design *design) YS_OVERRIDE
+       void execute(std::vector<std::string> args, RTLIL::Design *design) YS_OVERRIDE
        {
                string run_from, run_to;
                clear_flags();
@@ -118,7 +120,7 @@ struct SynthGreenPAK4Pass : public ScriptPass
                extra_args(args, argidx, design);
 
                if (!design->full_selection())
-                       log_cmd_error("This comannd only operates on fully selected designs!\n");
+                       log_cmd_error("This command only operates on fully selected designs!\n");
 
                if (part != "SLG46140V" && part != "SLG46620V" && part != "SLG46621V")
                        log_cmd_error("Invalid part name: '%s'\n", part.c_str());
@@ -131,7 +133,7 @@ struct SynthGreenPAK4Pass : public ScriptPass
                log_pop();
        }
 
-       virtual void script() YS_OVERRIDE
+       void script() YS_OVERRIDE
        {
                if (check_label("begin"))
                {
@@ -153,34 +155,39 @@ struct SynthGreenPAK4Pass : public ScriptPass
 
                if (check_label("fine"))
                {
-                       run("greenpak4_counters");
+                       run("extract_counter -pout GP_DCMP,GP_DAC -maxwidth 14");
                        run("clean");
                        run("opt -fast -mux_undef -undriven -fine");
                        run("memory_map");
                        run("opt -undriven -fine");
-                       run("techmap");
+                       run("techmap -map +/techmap.v -map +/greenpak4/cells_latch.v");
                        run("dfflibmap -prepare -liberty +/greenpak4/gp_dff.lib");
                        run("opt -fast");
                        if (retime || help_mode)
-                               run("abc -dff", "(only if -retime)");
+                               run("abc -dff -D 1", "(only if -retime)");
                }
 
                if (check_label("map_luts"))
                {
-                       if (help_mode || part == "SLG46140V") run("nlutmap -luts 0,6,8,2", " (for -part SLG46140V)");
-                       if (help_mode || part == "SLG46620V") run("nlutmap -luts 2,8,16,2", "(for -part SLG46620V)");
-                       if (help_mode || part == "SLG46621V") run("nlutmap -luts 2,8,16,2", "(for -part SLG46621V)");
+                       if (help_mode || part == "SLG46140V") run("nlutmap -assert -luts 0,6,8,2", " (for -part SLG46140V)");
+                       if (help_mode || part == "SLG46620V") run("nlutmap -assert -luts 2,8,16,2", "(for -part SLG46620V)");
+                       if (help_mode || part == "SLG46621V") run("nlutmap -assert -luts 2,8,16,2", "(for -part SLG46621V)");
                        run("clean");
                }
 
                if (check_label("map_cells"))
                {
+                       run("shregmap -tech greenpak4");
                        run("dfflibmap -liberty +/greenpak4/gp_dff.lib");
-                       run("techmap -map +/greenpak4/cells_map.v");
                        run("dffinit -ff GP_DFF Q INIT");
                        run("dffinit -ff GP_DFFR Q INIT");
                        run("dffinit -ff GP_DFFS Q INIT");
                        run("dffinit -ff GP_DFFSR Q INIT");
+                       run("iopadmap -bits -inpad GP_IBUF OUT:IN -outpad GP_OBUF IN:OUT -inoutpad GP_OBUF OUT:IN -toutpad GP_OBUFT OE:IN:OUT -tinoutpad GP_IOBUF OE:OUT:IN:IO");
+                       run("attrmvcp -attr src -attr LOC t:GP_OBUF t:GP_OBUFT t:GP_IOBUF n:*");
+                       run("attrmvcp -attr src -attr LOC -driven t:GP_IBUF n:*");
+                       run("techmap -map +/greenpak4/cells_map.v");
+                       run("greenpak4_dffinv");
                        run("clean");
                }
 
@@ -193,12 +200,9 @@ struct SynthGreenPAK4Pass : public ScriptPass
 
                if (check_label("json"))
                {
-                       run("splitnets", "(temporary workaround for gp4par parser limitation)");
                        if (!json_file.empty() || help_mode)
                                run(stringf("write_json %s", help_mode ? "<file-name>" : json_file.c_str()));
                }
-
-               log_pop();
        }
 } SynthGreenPAK4Pass;