From d038ba9d87906a81163de5b18725d70c6ce91a3f Mon Sep 17 00:00:00 2001 From: Byron Lathi Date: Wed, 8 Jan 2025 23:08:18 -0800 Subject: [PATCH] Add prefix --- sw/bldstage.cpp | 31 ++++---- sw/bldstage.h | 5 +- sw/butterfly.cpp | 45 +++++------ sw/butterfly.h | 5 +- sw/fftgen.cpp | 189 +++++++++++++++++++++++++++-------------------- sw/rounding.cpp | 20 +++-- sw/rounding.h | 8 +- sw/softmpy.cpp | 15 ++-- sw/softmpy.h | 6 +- 9 files changed, 180 insertions(+), 144 deletions(-) diff --git a/sw/bldstage.cpp b/sw/bldstage.cpp index 7847618..16fda20 100644 --- a/sw/bldstage.cpp +++ b/sw/bldstage.cpp @@ -73,7 +73,7 @@ // Builds the penultimate FFT stage, using integer operations only. // This stage is called laststage elsewhere. // -void build_dblstage(const char *fname, ROUND_T rounding, +void build_dblstage(const char *fname, const char* prefix, ROUND_T rounding, const bool async_reset, const bool dbg) { FILE *fp = fopen(fname, "w"); if (NULL == fp) { @@ -155,7 +155,7 @@ SLASHLINE fprintf(fp, "%s", cpyleft); fprintf(fp, "//\n//\n`default_nettype\tnone\n//\n"); fprintf(fp, -"module\tlaststage%s #(\n" +"module\t%slaststage%s #(\n" "\t\t// {{{\n" // (i_clk, %s, i_ce, i_sync, i_left, i_right, o_left, o_right, o_sync%s);\n" "\t\tparameter\tIWIDTH=%d,OWIDTH=IWIDTH+1, SHIFT=%d\n" @@ -166,7 +166,7 @@ SLASHLINE "\t\tinput\twire\t[(2*IWIDTH-1):0]\ti_left, i_right,\n" "\t\toutput\treg\t[(2*OWIDTH-1):0]\to_left, o_right,\n" "\t\toutput\treg\t\t\to_sync%s\n" - "\n", (dbg)?"_dbg":"", // resetw.c_str(), (dbg)?", o_dbg":"", + "\n", prefix, (dbg)?"_dbg":"", // resetw.c_str(), (dbg)?", o_dbg":"", TST_DBLSTAGE_IWIDTH, TST_DBLSTAGE_SHIFT, resetw.c_str(), (dbg) ? ",":""); @@ -249,17 +249,17 @@ SLASHLINE "\t// }}}\n" "\n"); fprintf(fp, - "\t%s #(IWIDTH+1,OWIDTH,SHIFT) do_rnd_0r(i_clk, i_ce,\n" - "\t\t\t\t\t\t\trnd_in_0r, o_out_0r);\n\n", rnd_string); + "\t%s%s #(IWIDTH+1,OWIDTH,SHIFT) do_rnd_0r(i_clk, i_ce,\n" + "\t\t\t\t\t\t\trnd_in_0r, o_out_0r);\n\n", prefix, rnd_string); fprintf(fp, - "\t%s #(IWIDTH+1,OWIDTH,SHIFT) do_rnd_0i(i_clk, i_ce,\n" - "\t\t\t\t\t\t\trnd_in_0i, o_out_0i);\n\n", rnd_string); + "\t%s%s #(IWIDTH+1,OWIDTH,SHIFT) do_rnd_0i(i_clk, i_ce,\n" + "\t\t\t\t\t\t\trnd_in_0i, o_out_0i);\n\n", prefix, rnd_string); fprintf(fp, - "\t%s #(IWIDTH+1,OWIDTH,SHIFT) do_rnd_1r(i_clk, i_ce,\n" - "\t\t\t\t\t\t\trnd_in_1r, o_out_1r);\n\n", rnd_string); + "\t%s%s #(IWIDTH+1,OWIDTH,SHIFT) do_rnd_1r(i_clk, i_ce,\n" + "\t\t\t\t\t\t\trnd_in_1r, o_out_1r);\n\n", prefix, rnd_string); fprintf(fp, - "\t%s #(IWIDTH+1,OWIDTH,SHIFT) do_rnd_1i(i_clk, i_ce,\n" - "\t\t\t\t\t\t\trnd_in_1i, o_out_1i);\n\n", rnd_string); + "\t%s%s #(IWIDTH+1,OWIDTH,SHIFT) do_rnd_1i(i_clk, i_ce,\n" + "\t\t\t\t\t\t\trnd_in_1i, o_out_1i);\n\n", prefix, rnd_string); fprintf(fp, "\n" "\t// o_left, o_right\n" @@ -297,6 +297,7 @@ SLASHLINE // build_stage // {{{ void build_stage(const char *fname, + const char* prefix, int stage, int nwide, int offset, int nbits, int xtra, int ckpce, const bool async_reset, const bool dbg) { @@ -349,7 +350,7 @@ SLASHLINE (dbg)?"_dbg":"", prjname, creator); fprintf(fstage, "%s", cpyleft); fprintf(fstage, "//\n//\n`default_nettype\tnone\n//\n"); - fprintf(fstage, "module\tfftstage%s #(\n", (dbg)?"_dbg":""); + fprintf(fstage, "module\t%sfftstage%s #(\n", prefix, (dbg)?"_dbg":""); fprintf(fstage, "\t\t// {{{\n"); // These parameter values are useless at this point--they are to be // replaced by the parameter values in the calling program. Only @@ -591,7 +592,8 @@ SLASHLINE "\tgenerate if (OPT_HWMPY)\n" "\tbegin : HWBFLY\n" "\n" - "\t\thwbfly #(\n" + "\t\t%shwbfly #(\n", prefix); + fprintf(fstage, "\t\t\t// {{{\n" "\t\t\t.IWIDTH(IWIDTH),\n" "\t\t\t.CWIDTH(CWIDTH),\n" @@ -619,7 +621,8 @@ SLASHLINE "\n" "\tend else begin : FWBFLY\n" "\n" - "\t\tbutterfly #(\n" + "\t\t%sbutterfly #(\n", prefix); + fprintf(fstage, "\t\t\t// {{{\n" "\t\t\t.IWIDTH(IWIDTH),\n" "\t\t\t.CWIDTH(CWIDTH),\n" diff --git a/sw/bldstage.h b/sw/bldstage.h index f2c1f5f..7d26b33 100644 --- a/sw/bldstage.h +++ b/sw/bldstage.h @@ -40,10 +40,11 @@ #include "rounding.h" -extern void build_dblstage(const char *fname, ROUND_T rounding, - const bool async_reset = false, const bool dbg = false); +extern void build_dblstage(const char *fname, const char* prefix, + ROUND_T rounding, const bool async_reset = false, const bool dbg = false); extern void build_stage(const char *fname, + const char* prefix, int stage, int nwide, int offset, int nbits, int xtra, int ckpce, const bool async_reset = false, diff --git a/sw/butterfly.cpp b/sw/butterfly.cpp index 3a09226..26e381d 100644 --- a/sw/butterfly.cpp +++ b/sw/butterfly.cpp @@ -94,7 +94,7 @@ int lstat(const char *filename, struct stat *buf) { return 1; }; // build_butterfly // {{{ -void build_butterfly(const char *fname, int xtracbits, ROUND_T rounding, +void build_butterfly(const char *fname, const char *prefix, int xtracbits, ROUND_T rounding, int ckpce, const bool async_reset) { FILE *fp = fopen(fname, "w"); if (NULL == fp) { @@ -200,9 +200,10 @@ SLASHLINE fprintf(fp, "//\n//\n`default_nettype\tnone\n//\n"); fprintf(fp, -"module\tbutterfly #(\n" +"module\t%sbutterfly #(\n" "\t\t// {{{\n" - "\t\t// Public changeable parameters ...\n"); + "\t\t// Public changeable parameters ...\n", + prefix); fprintf(fp, "\t\t// IWIDTH\n" @@ -1129,17 +1130,17 @@ SLASHLINE "\tassign left_si = { {(2){fifo_i[(IWIDTH+CWIDTH)]}}, fifo_i };\n\n"); fprintf(fp, - "\t%s #(CWIDTH+IWIDTH+3,OWIDTH,SHIFT+4)\n" - "\tdo_rnd_left_r(i_clk, i_ce, left_sr, rnd_left_r);\n\n", rnd_string); + "\t%s%s #(CWIDTH+IWIDTH+3,OWIDTH,SHIFT+4)\n" + "\tdo_rnd_left_r(i_clk, i_ce, left_sr, rnd_left_r);\n\n", prefix, rnd_string); fprintf(fp, - "\t%s #(CWIDTH+IWIDTH+3,OWIDTH,SHIFT+4)\n" - "\tdo_rnd_left_i(i_clk, i_ce, left_si, rnd_left_i);\n\n", rnd_string); + "\t%s%s #(CWIDTH+IWIDTH+3,OWIDTH,SHIFT+4)\n" + "\tdo_rnd_left_i(i_clk, i_ce, left_si, rnd_left_i);\n\n", prefix, rnd_string); fprintf(fp, - "\t%s #(CWIDTH+IWIDTH+3,OWIDTH,SHIFT+4)\n" - "\tdo_rnd_right_r(i_clk, i_ce, mpy_r, rnd_right_r);\n\n", rnd_string); + "\t%s%s #(CWIDTH+IWIDTH+3,OWIDTH,SHIFT+4)\n" + "\tdo_rnd_right_r(i_clk, i_ce, mpy_r, rnd_right_r);\n\n", prefix, rnd_string); fprintf(fp, - "\t%s #(CWIDTH+IWIDTH+3,OWIDTH,SHIFT+4)\n" - "\tdo_rnd_right_i(i_clk, i_ce, mpy_i, rnd_right_i);\n", rnd_string); + "\t%s%s #(CWIDTH+IWIDTH+3,OWIDTH,SHIFT+4)\n" + "\tdo_rnd_right_i(i_clk, i_ce, mpy_i, rnd_right_i);\n", prefix, rnd_string); fprintf(fp, "\t// }}}\n\n"); fprintf(fp, "\t// fifo_read, mpy_r, mpy_i\n" @@ -1546,7 +1547,7 @@ SLASHLINE // build_hwbfly // {{{ -void build_hwbfly(const char *fname, int xtracbits, ROUND_T rounding, +void build_hwbfly(const char *fname, const char* prefix, int xtracbits, ROUND_T rounding, int ckpce, const bool async_reset) { FILE *fp = fopen(fname, "w"); if (NULL == fp) { @@ -1609,7 +1610,7 @@ SLASHLINE fprintf(fp, "%s", cpyleft); fprintf(fp, "//\n//\n`default_nettype\tnone\n//\n"); fprintf(fp, -"module hwbfly #(\n" +"module %shwbfly #(\n" // (i_clk, %s, i_ce, i_coef, i_left, i_right, i_aux,\n" // "\t\to_left, o_right, o_aux);\n" "\t\t// {{{\n" @@ -1629,7 +1630,7 @@ SLASHLINE "\t\t// {{{\n" "\t\t// The number of clocks per clock enable, 1, 2, or 3.\n" "\t\tparameter\t[1:0]\tCKPCE=%d\n\t\t// }}}\n\t\t// }}}\n", - xtracbits, ckpce); + prefix, xtracbits, ckpce); fprintf(fp, "\t) (\n" @@ -2213,17 +2214,17 @@ SLASHLINE fprintf(fp, "\t// Round the results\n" "\t// {{{\n" - "\t%s #(CWIDTH+IWIDTH+1,OWIDTH,SHIFT+2)\n" - "\tdo_rnd_left_r(i_clk, i_ce, left_sr, rnd_left_r);\n\n", rnd_string); + "\t%s%s #(CWIDTH+IWIDTH+1,OWIDTH,SHIFT+2)\n" + "\tdo_rnd_left_r(i_clk, i_ce, left_sr, rnd_left_r);\n\n", prefix, rnd_string); fprintf(fp, - "\t%s #(CWIDTH+IWIDTH+1,OWIDTH,SHIFT+2)\n" - "\tdo_rnd_left_i(i_clk, i_ce, left_si, rnd_left_i);\n\n", rnd_string); + "\t%s%s #(CWIDTH+IWIDTH+1,OWIDTH,SHIFT+2)\n" + "\tdo_rnd_left_i(i_clk, i_ce, left_si, rnd_left_i);\n\n", prefix, rnd_string); fprintf(fp, - "\t%s #(CWIDTH+IWIDTH+3,OWIDTH,SHIFT+4)\n" - "\tdo_rnd_right_r(i_clk, i_ce, mpy_r, rnd_right_r);\n\n", rnd_string); + "\t%s%s #(CWIDTH+IWIDTH+3,OWIDTH,SHIFT+4)\n" + "\tdo_rnd_right_r(i_clk, i_ce, mpy_r, rnd_right_r);\n\n", prefix, rnd_string); fprintf(fp, - "\t%s #(CWIDTH+IWIDTH+3,OWIDTH,SHIFT+4)\n" - "\tdo_rnd_right_i(i_clk, i_ce, mpy_i, rnd_right_i);\n\t// }}}\n\n", rnd_string); + "\t%s%s #(CWIDTH+IWIDTH+3,OWIDTH,SHIFT+4)\n" + "\tdo_rnd_right_i(i_clk, i_ce, mpy_i, rnd_right_i);\n\t// }}}\n\n", prefix, rnd_string); fprintf(fp, diff --git a/sw/butterfly.h b/sw/butterfly.h index 1a49fb7..ccac6ff 100644 --- a/sw/butterfly.h +++ b/sw/butterfly.h @@ -39,11 +39,12 @@ #ifndef BUTTERFLY_H #define BUTTERFLY_H -extern void build_butterfly(const char *fname, int xtracbits, +extern void build_butterfly(const char *fname, const char* prefix, int xtracbits, ROUND_T rounding, int ckpce = 1, const bool async_reset = false); -extern void build_hwbfly(const char *fname, int xtracbits, ROUND_T rounding, +extern void build_hwbfly(const char *fname, const char* prefix, + int xtracbits, ROUND_T rounding, int ckpce = 3, const bool async_reset= false); #endif diff --git a/sw/fftgen.cpp b/sw/fftgen.cpp index 3e10b42..d8a5b66 100644 --- a/sw/fftgen.cpp +++ b/sw/fftgen.cpp @@ -117,7 +117,7 @@ int lstat(const char *filename, struct stat *buf) { return 1; }; // build_dblquarters // {{{ -void build_dblquarters(const char *fname, ROUND_T rounding, const bool async_reset=false, const bool dbg=false) { +void build_dblquarters(const char *fname, const char* prefix, ROUND_T rounding, const bool async_reset=false, const bool dbg=false) { FILE *fp = fopen(fname, "w"); if (NULL == fp) { fprintf(stderr, "Could not open \'%s\' for writing\n", fname); @@ -158,7 +158,7 @@ SLASHLINE resetw = std::string("i_areset_n"); fprintf(fp, -"module\tqtrstage%s(i_clk, %s, i_ce, i_sync, i_data, o_data, o_sync%s);\n" +"module\t%sqtrstage%s(i_clk, %s, i_ce, i_sync, i_data, o_data, o_sync%s);\n" "\tparameter IWIDTH=%d, OWIDTH=IWIDTH+1;\n" "\t// Parameters specific to the core that should be changed when this\n" "\t// core is built ... Note that the minimum LGSPAN is 2. Smaller\n" @@ -168,7 +168,9 @@ SLASHLINE "\tinput\twire [(2*IWIDTH-1):0] i_data;\n" "\toutput\treg [(2*OWIDTH-1):0] o_data;\n" "\toutput\treg o_sync;\n" - "\n", (dbg)?"_dbg":"", + "\n", + prefix, + (dbg)?"_dbg":"", resetw.c_str(), (dbg)?", o_dbg":"", TST_QTRSTAGE_IWIDTH, TST_QTRSTAGE_LGWIDTH, resetw.c_str()); @@ -206,17 +208,17 @@ SLASHLINE fprintf(fp, "\t\t\t\t\tn_rnd_diff_r, n_rnd_diff_i;\n"); fprintf(fp, - "\t%s #(IWIDTH+1,OWIDTH,SHIFT)\n\tdo_rnd_sum_r(i_clk, i_ce, " - "sum_r, rnd_sum_r);\n\n", rnd_string); + "\t%s%s #(IWIDTH+1,OWIDTH,SHIFT)\n\tdo_rnd_sum_r(i_clk, i_ce, " + "sum_r, rnd_sum_r);\n\n", prefix, rnd_string); fprintf(fp, - "\t%s #(IWIDTH+1,OWIDTH,SHIFT)\n\tdo_rnd_sum_i(i_clk, i_ce, " - "sum_i, rnd_sum_i);\n\n", rnd_string); + "\t%s%s #(IWIDTH+1,OWIDTH,SHIFT)\n\tdo_rnd_sum_i(i_clk, i_ce, " + "sum_i, rnd_sum_i);\n\n", prefix, rnd_string); fprintf(fp, - "\t%s #(IWIDTH+1,OWIDTH,SHIFT)\n\tdo_rnd_diff_r(i_clk, i_ce, " - "diff_r, rnd_diff_r);\n\n", rnd_string); + "\t%s%s #(IWIDTH+1,OWIDTH,SHIFT)\n\tdo_rnd_diff_r(i_clk, i_ce, " + "diff_r, rnd_diff_r);\n\n", prefix, rnd_string); fprintf(fp, - "\t%s #(IWIDTH+1,OWIDTH,SHIFT)\n\tdo_rnd_diff_i(i_clk, i_ce, " - "diff_i, rnd_diff_i);\n\n", rnd_string); + "\t%s%s #(IWIDTH+1,OWIDTH,SHIFT)\n\tdo_rnd_diff_i(i_clk, i_ce, " + "diff_i, rnd_diff_i);\n\n", prefix, rnd_string); fprintf(fp, "\tassign n_rnd_diff_r = - rnd_diff_r;\n" "\tassign n_rnd_diff_i = - rnd_diff_i;\n"); @@ -396,7 +398,7 @@ SLASHLINE // build_snglquarters // {{{ -void build_snglquarters(const char *fname, ROUND_T rounding, const bool async_reset=false, const bool dbg=false) { +void build_snglquarters(const char *fname, const char* prefix, ROUND_T rounding, const bool async_reset=false, const bool dbg=false) { FILE *fp = fopen(fname, "w"); if (NULL == fp) { fprintf(stderr, "Could not open \'%s\' for writing\n", fname); @@ -468,14 +470,14 @@ SLASHLINE resetw = std::string("i_areset_n"); fprintf(fp, -"module\tqtrstage%s(i_clk, %s, i_ce, i_sync, i_data, o_data, o_sync%s);\n" +"module\t%sqtrstage%s(i_clk, %s, i_ce, i_sync, i_data, o_data, o_sync%s);\n" "\tparameter IWIDTH=%d, OWIDTH=IWIDTH+1;\n" "\tparameter\tLGWIDTH=%d, INVERSE=0,SHIFT=0;\n" "\tinput\twire i_clk, %s, i_ce, i_sync;\n" "\tinput\twire [(2*IWIDTH-1):0] i_data;\n" "\toutput\treg [(2*OWIDTH-1):0] o_data;\n" "\toutput\treg o_sync;\n" - "\t\n", (dbg)?"_dbg":"", resetw.c_str(), + "\t\n", prefix, (dbg)?"_dbg":"", resetw.c_str(), (dbg)?", o_dbg":"", TST_QTRSTAGE_IWIDTH, TST_QTRSTAGE_LGWIDTH, resetw.c_str()); if (dbg) { fprintf(fp, "\toutput\twire\t[33:0]\t\t\to_dbg;\n" @@ -516,17 +518,17 @@ SLASHLINE fprintf(fp, "\twire\tsigned\t[(OWIDTH-1):0]\trnd_sum_r, rnd_sum_i,\n" "\t\t\trnd_diff_r, rnd_diff_i, n_rnd_diff_r, n_rnd_diff_i;\n" - "\t%s #(IWIDTH+1,OWIDTH,SHIFT)\tdo_rnd_sum_r(i_clk, i_ce,\n" - "\t\t\t\tsum_r, rnd_sum_r);\n\n", rnd_string); + "\t%s%s #(IWIDTH+1,OWIDTH,SHIFT)\tdo_rnd_sum_r(i_clk, i_ce,\n" + "\t\t\t\tsum_r, rnd_sum_r);\n\n", prefix, rnd_string); fprintf(fp, - "\t%s #(IWIDTH+1,OWIDTH,SHIFT)\tdo_rnd_sum_i(i_clk, i_ce,\n" - "\t\t\t\tsum_i, rnd_sum_i);\n\n", rnd_string); + "\t%s%s #(IWIDTH+1,OWIDTH,SHIFT)\tdo_rnd_sum_i(i_clk, i_ce,\n" + "\t\t\t\tsum_i, rnd_sum_i);\n\n", prefix, rnd_string); fprintf(fp, - "\t%s #(IWIDTH+1,OWIDTH,SHIFT)\tdo_rnd_diff_r(i_clk, i_ce,\n" - "\t\t\t\tdiff_r, rnd_diff_r);\n\n", rnd_string); + "\t%s%s #(IWIDTH+1,OWIDTH,SHIFT)\tdo_rnd_diff_r(i_clk, i_ce,\n" + "\t\t\t\tdiff_r, rnd_diff_r);\n\n", prefix, rnd_string); fprintf(fp, - "\t%s #(IWIDTH+1,OWIDTH,SHIFT)\tdo_rnd_diff_i(i_clk, i_ce,\n" - "\t\t\t\tdiff_i, rnd_diff_i);\n\n", rnd_string); + "\t%s%s #(IWIDTH+1,OWIDTH,SHIFT)\tdo_rnd_diff_i(i_clk, i_ce,\n" + "\t\t\t\tdiff_i, rnd_diff_i);\n\n", prefix, rnd_string); fprintf(fp, "\tassign n_rnd_diff_r = - rnd_diff_r;\n" "\tassign n_rnd_diff_i = - rnd_diff_i;\n"); fprintf(fp, @@ -818,7 +820,7 @@ SLASHLINE // build_sngllast // {{{ -void build_sngllast(const char *fname, const bool async_reset = false) { +void build_sngllast(const char *fname, const char* prefix, const bool async_reset = false) { FILE *fp = fopen(fname, "w"); if (NULL == fp) { fprintf(stderr, "Could not open \'%s\' for writing\n", fname); @@ -847,7 +849,7 @@ SLASHLINE fprintf(fp, "//\n//\n`default_nettype\tnone\n//\n"); fprintf(fp, -"module laststage #(\n" +"module %slaststage #(\n" "\t\t// {{{\n" "\t\tparameter IWIDTH=16,OWIDTH=IWIDTH+1, SHIFT=0\n" "\t\t// }}}\n" @@ -859,7 +861,7 @@ SLASHLINE "\t\toutput\treg o_sync\n" "\t\t// }}}\n" "\t);\n", - resetw.c_str()); + prefix, resetw.c_str()); fprintf(fp, "\t// Local declarations\n" @@ -971,12 +973,12 @@ SLASHLINE "\n" "\t// Round the results, generating o_r, o_i, and thus o_val\n" "\t// {{{\n" -" convround #(IWIDTH+1,OWIDTH,SHIFT) do_rnd_r(i_clk, i_ce, rnd_r, o_r);\n" -" convround #(IWIDTH+1,OWIDTH,SHIFT) do_rnd_i(i_clk, i_ce, rnd_i, o_i);\n" +" %sconvround #(IWIDTH+1,OWIDTH,SHIFT) do_rnd_r(i_clk, i_ce, rnd_r, o_r);\n" +" %sconvround #(IWIDTH+1,OWIDTH,SHIFT) do_rnd_i(i_clk, i_ce, rnd_i, o_i);\n" "\n" " assign o_val = { o_r, o_i };\n" "\t// }}}\n" -"\n"); +"\n", prefix, prefix); fprintf(fp, SLASHLINE @@ -1138,7 +1140,9 @@ void usage(void) { "\t-S\tInclude the final bit reversal stage (default).\n" "\t-x \tUse this many extra bits internally, before any final\n" "\t\trounding or truncation of the answer to the final number of\n" -"\t\tbits. The default is to use %d extra bits internally.\n", +"\t\tbits. The default is to use %d extra bits internally.\n" +"\t-P Adds a prefix to all generated modules. Useful for\n" +"\t\tdesigns which use multiple different instances of the (i)FFT\n", /* "\t-0\tA forward FFT (default), meaning that the coefficients are\n" "\t\tgiven by e^{-j 2 pi k/N n }.\n" @@ -1163,7 +1167,7 @@ int main(int argc, char **argv) { real_fft = false, async_reset = false; FILE *vmain; - std::string coredir = DEF_COREDIR, cmdline = "", hdrname = ""; + std::string coredir = DEF_COREDIR, cmdline = "", hdrname = "", prefix = ""; ROUND_T rounding = RND_CONVERGENT; // ROUND_T rounding = RND_HALFUP; @@ -1183,7 +1187,7 @@ int main(int argc, char **argv) { } { int c; - while((c = getopt(argc, argv, "12Aa:c:d:D:f:hik:m:n:p:rsSx:v")) != -1) { + while((c = getopt(argc, argv, "12Aa:c:d:D:f:hik:m:n:p:P:rsSx:v")) != -1) { switch(c) { case '1': single_clock = true; break; case '2': single_clock = false; break; @@ -1222,6 +1226,7 @@ int main(int argc, char **argv) { case 'm': maxbitsout = atoi(optarg); break; case 'n': nbitsin = atoi(optarg); break; case 'p': nummpy = atoi(optarg); break; + case 'P': prefix = std::string(optarg) + "_"; break; case 'r': real_fft = true; break; case 'S': bitreverse = true; break; case 's': bitreverse = false; break; @@ -1258,6 +1263,10 @@ int main(int argc, char **argv) { printf("A C header file, %s, will be written capturing these\n" "options for a Verilator testbench\n", hdrname.c_str()); + + if (!prefix.empty()){ + printf("All files/modules will be prefixed with %s\n", prefix.c_str()); + } // nummpy // xtrapbits } @@ -1511,6 +1520,7 @@ SLASHLINE fname_string = coredir; fname_string += "/"; + fname_string += prefix; if (inverse) fname_string += "i"; fname_string += "fftmain.v"; @@ -1531,7 +1541,7 @@ SLASHLINE fprintf(vmain, SLASHLINE "//\n" -"// Filename:\t%sfftmain.v\n" +"// Filename:\t%s%sfftmain.v\n" "// {{{\n" // "}}}" "// Project: %s\n" "//\n" @@ -1539,7 +1549,7 @@ SLASHLINE "// implementation. As such, all other modules are subordinate\n" "// to this one. This module accomplish a fixed size Complex FFT on\n" "// %d data points.\n", - (inverse)?"i":"",prjname, fftsize); + prefix.c_str(),(inverse)?"i":"",prjname, fftsize); if (single_clock) { fprintf(vmain, "// The FFT is fully pipelined, and accepts as inputs one complex two\'s\n" @@ -1623,8 +1633,8 @@ SLASHLINE fprintf(vmain, "//\n"); fprintf(vmain, "//\n"); - fprintf(vmain, "module %sfftmain(i_clk, %s, i_ce,\n", - (inverse)?"i":"", resetw.c_str()); + fprintf(vmain, "module %s%sfftmain(i_clk, %s, i_ce,\n", + prefix.c_str(),(inverse)?"i":"", resetw.c_str()); if (single_clock) { fprintf(vmain, "\t\ti_sample, o_result, o_sync%s);\n", (dbg)?", o_dbg":""); @@ -1822,7 +1832,7 @@ SLASHLINE cmemfp = gen_coeff_open(cmem.c_str()); gen_coeffs(cmemfp, fftsize, nbitsin+xtracbits, 1, 0, inverse); cmem = gen_coeff_fname(EMPTYSTR, fftsize, 1, 0, inverse); - fprintf(vmain, "\tfftstage%s\t#(\n" + fprintf(vmain, "\t%sfftstage%s\t#(\n" "\t\t// {{{\n" "\t\t.IWIDTH(IWIDTH),\n" "\t\t.CWIDTH(IWIDTH+%d),\n" @@ -1838,6 +1848,7 @@ SLASHLINE "\t\t.i_clk(i_clk),\n" "\t\t.%s(%s),\n" "\t\t.i_ce(i_ce),\n", + prefix.c_str(), ((dbg)&&(dbgstage == fftsize))?"_dbg":"", xtracbits, obits+xtrapbits, lgtmp-1, (mpystage)?1:0, @@ -1862,7 +1873,7 @@ SLASHLINE cmemfp = gen_coeff_open(cmem.c_str()); gen_coeffs(cmemfp, fftsize, nbitsin+xtracbits, 2, 0, inverse); cmem = gen_coeff_fname(EMPTYSTR, fftsize, 2, 0, inverse); - fprintf(vmain, "\tfftstage%s\t#(\n" + fprintf(vmain, "\t%sfftstage%s\t#(\n" "\t\t// {{{\n" "\t\t.IWIDTH(IWIDTH),\n" "\t\t.CWIDTH(IWIDTH+%d),\n" @@ -1878,6 +1889,7 @@ SLASHLINE "\t\t.i_clk(i_clk),\n" "\t\t.%s(%s),\n" "\t\t.i_ce(i_ce),\n", + prefix.c_str(), ((dbg)&&(dbgstage == fftsize))?"_dbg":"", xtracbits, obits+xtrapbits, lgtmp-2, (mpystage)?1:0, @@ -1897,7 +1909,7 @@ SLASHLINE cmemfp = gen_coeff_open(cmem.c_str()); gen_coeffs(cmemfp, fftsize, nbitsin+xtracbits, 2, 1, inverse); cmem = gen_coeff_fname(EMPTYSTR, fftsize, 2, 1, inverse); - fprintf(vmain, "\tfftstage\t#(\n" + fprintf(vmain, "\t%sfftstage\t#(\n" "\t\t// {{{\n" "\t\t.IWIDTH(IWIDTH),\n" "\t\t.CWIDTH(IWIDTH+%d),\n" @@ -1913,6 +1925,7 @@ SLASHLINE "\t\t.i_clk(i_clk),\n" "\t\t.%s(%s),\n" "\t\t.i_ce(i_ce),\n", + prefix.c_str(), xtracbits, obits+xtrapbits, lgtmp-2, (mpystage)?1:0, ckpce, cmem.c_str(), @@ -1934,6 +1947,7 @@ SLASHLINE std::string fname; fname = coredir + "/"; + fname += prefix; if (inverse) fname += "i"; fname += "fftstage"; @@ -1942,20 +1956,20 @@ SLASHLINE dbgname += "_dbg"; dbgname += ".v"; if (single_clock) - build_stage(fname.c_str(), fftsize, 1, 0, nbits, xtracbits, ckpce, async_reset, true); + build_stage(fname.c_str(), prefix.c_str(), fftsize, 1, 0, nbits, xtracbits, ckpce, async_reset, true); else - build_stage(fname.c_str(), fftsize, 2, 1, nbits, xtracbits, ckpce, async_reset, true); + build_stage(fname.c_str(), prefix.c_str(), fftsize, 2, 1, nbits, xtracbits, ckpce, async_reset, true); } fname += ".v"; if (single_clock) { - build_stage(fname.c_str(), fftsize, 1, 0, + build_stage(fname.c_str(), prefix.c_str(), fftsize, 1, 0, nbits, xtracbits, ckpce, async_reset, false); } else { // All stages use the same Verilog, so we only // need to build one - build_stage(fname.c_str(), fftsize, 2, 1, + build_stage(fname.c_str(), prefix.c_str(), fftsize, 2, 1, nbits, xtracbits, ckpce, async_reset, false); } // }}} @@ -1993,7 +2007,7 @@ SLASHLINE gen_coeffs(cmemfp, tmp_size, nbits+xtracbits+xtrapbits, 1, 0, inverse); cmem = gen_coeff_fname(EMPTYSTR, tmp_size, 1, 0, inverse); - fprintf(vmain, "\tfftstage%s\t#(\n" + fprintf(vmain, "\t%sfftstage%s\t#(\n" "\t\t// {{{\n" "\t\t.IWIDTH(%d),\n" "\t\t.CWIDTH(%d),\n" @@ -2009,6 +2023,7 @@ SLASHLINE "\t\t.i_clk(i_clk),\n" "\t\t.%s(%s),\n" "\t\t.i_ce(i_ce),\n", + prefix.c_str(), ((dbg)&&(dbgstage==tmp_size))?"_dbg":"", nbits+xtrapbits, nbits+xtracbits+xtrapbits, @@ -2041,7 +2056,7 @@ SLASHLINE gen_coeffs(cmemfp, tmp_size, nbits+xtracbits+xtrapbits, 2, 0, inverse); cmem = gen_coeff_fname(EMPTYSTR, tmp_size, 2, 0, inverse); - fprintf(vmain, "\tfftstage%s\t#(\n" + fprintf(vmain, "\t%sfftstage%s\t#(\n" "\t\t// {{{\n" "\t\t.IWIDTH(%d),\n" "\t\t.CWIDTH(%d),\n" @@ -2057,6 +2072,7 @@ SLASHLINE "\t\t.i_clk(i_clk),\n" "\t\t.%s(%s),\n" "\t\t.i_ce(i_ce),\n", + prefix.c_str(), ((dbg)&&(dbgstage==tmp_size))?"_dbg":"", nbits+xtrapbits, nbits+xtracbits+xtrapbits, @@ -2084,7 +2100,7 @@ SLASHLINE 2, 1, inverse); cmem = gen_coeff_fname(EMPTYSTR, tmp_size, 2, 1, inverse); - fprintf(vmain, "\tfftstage\t#(\n" + fprintf(vmain, "\t%sfftstage\t#(\n" "\t\t// {{{\n" "\t\t.IWIDTH(%d),\n" "\t\t.CWIDTH(%d),\n" @@ -2100,6 +2116,7 @@ SLASHLINE "\t\t.i_clk(i_clk),\n" "\t\t.%s(%s),\n" "\t\t.i_ce(i_ce),\n", + prefix.c_str(), nbits+xtrapbits, nbits+xtracbits+xtrapbits, obits+xtrapbits, @@ -2140,7 +2157,7 @@ SLASHLINE // {{{ fprintf(vmain, "\twire\t[%d:0]\tw_d4;\n", 2*(obits+xtrapbits)-1); - fprintf(vmain, "\tqtrstage%s\t#(\n" + fprintf(vmain, "\t%sqtrstage%s\t#(\n" "\t\t// {{{\n" "\t\t.IWIDTH(%d),\n" "\t\t.OWIDTH(%d),\n" @@ -2153,6 +2170,7 @@ SLASHLINE "\t\t.i_clk(i_clk),\n" "\t\t.%s(%s),\n" "\t\t.i_ce(i_ce),\n", + prefix.c_str(), ((dbg)&&(dbgstage==4))?"_dbg":"", nbits+xtrapbits, obits+xtrapbits, lgsize, (inverse)?1:0, (dropbit)?0:0, @@ -2170,7 +2188,7 @@ SLASHLINE // {{{ fprintf(vmain, "\t// verilator lint_off UNUSED\n\twire\t\tw_os4;\n\t// verilator lint_on UNUSED\n"); fprintf(vmain, "\twire\t[%d:0]\tw_e4, w_o4;\n", 2*(obits+xtrapbits)-1); - fprintf(vmain, "\tqtrstage%s\t#(\n" + fprintf(vmain, "\t%sqtrstage%s\t#(\n" "\t\t// {{{\n" "\t\t.IWIDTH(%d),\n" "\t\t.OWIDTH(%d),\n" @@ -2184,6 +2202,7 @@ SLASHLINE "\t\t.i_clk(i_clk),\n" "\t\t.%s(%s),\n" "\t\t.i_ce(i_ce),\n", + prefix.c_str(), ((dbg)&&(dbgstage==4))?"_dbg":"", nbits+xtrapbits, obits+xtrapbits, lgsize, (inverse)?1:0, (dropbit)?0:0, @@ -2250,7 +2269,7 @@ SLASHLINE if (single_clock) { // {{{ - fprintf(vmain, "\tlaststage\t#(\n" + fprintf(vmain, "\t%slaststage\t#(\n" "\t\t// {{{\n" "\t\t.IWIDTH(%d),\n" "\t\t.OWIDTH(%d),\n" @@ -2261,6 +2280,7 @@ SLASHLINE "\t\t.i_clk(i_clk),\n" "\t\t.%s(%s),\n" "\t\t.i_ce(i_ce),\n", + prefix.c_str(), nbits+xtrapbits, obits,(dropbit)?0:1, resetw.c_str(), resetw.c_str()); fprintf(vmain, "\t\t.i_sync(w_s4),\n" @@ -2272,7 +2292,7 @@ SLASHLINE // }}} } else { // {{{ - fprintf(vmain, "\tlaststage\t#(\n" + fprintf(vmain, "\t%slaststage\t#(\n" "\t\t// {{{\n" "\t\t.IWIDTH(%d),\n" "\t\t.OWIDTH(%d),\n" @@ -2283,6 +2303,7 @@ SLASHLINE "\t\t.i_clk(i_clk),\n" "\t\t.%s(%s),\n" "\t\t.i_ce(i_ce),\n", + prefix.c_str(), nbits+xtrapbits, obits,(dropbit)?0:1, resetw.c_str(), resetw.c_str()); fprintf(vmain, "\t\t.i_sync(w_s4),\n" @@ -2326,14 +2347,16 @@ SLASHLINE fprintf(vmain, "\t// Now for the bit-reversal stage.\n"); if (bitreverse) { if (single_clock) { - fprintf(vmain, "\tbitreverse\t#(\n" + fprintf(vmain, "\t%sbitreverse\t#(\n" "\t\t// {{{\n" "\t\t.LGSIZE(%d), .WIDTH(%d)\n" "\t\t// }}}\n" "\t) revstage (\n" "\t\t// {{{\n" "\t\t.i_clk(i_clk),\n" - "\t\t.%s(%s),\n", lgsize, nbitsout, + "\t\t.%s(%s),\n", + prefix.c_str(), + lgsize, nbitsout, resetw.c_str(), resetw.c_str()); fprintf(vmain, @@ -2344,7 +2367,7 @@ SLASHLINE "\t\t// }}}\n" "\t);\n"); } else { - fprintf(vmain, "\tbitreverse\t#(\n" + fprintf(vmain, "\t%sbitreverse\t#(\n" "\t\t// {{{\n" "\t\t.LGSIZE(%d),\n" "\t\t.WIDTH(%d)\n" @@ -2352,7 +2375,9 @@ SLASHLINE "\t) revstage (\n" "\t\t// {{{\n" "\t\t.i_clk(i_clk),\n" - "\t\t.%s(%s),\n", lgsize, nbitsout, + "\t\t.%s(%s),\n", + prefix.c_str(), + lgsize, nbitsout, resetw.c_str(), resetw.c_str()); fprintf(vmain, "\t\t.i_ce(i_ce & br_start),\n" @@ -2431,59 +2456,59 @@ SLASHLINE // Butterfly // {{{ - fname = coredir + "/butterfly.v"; - build_butterfly(fname.c_str(), xtracbits, rounding, + fname = coredir + "/" + prefix + "butterfly.v"; + build_butterfly(fname.c_str(), prefix.c_str(), xtracbits, rounding, ckpce, async_reset); // }}} // The hardware assisted butterfly // {{{ - fname = coredir + "/hwbfly.v"; - build_hwbfly(fname.c_str(), xtracbits, rounding, + fname = coredir + "/" + prefix + "hwbfly.v"; + build_hwbfly(fname.c_str(), prefix.c_str(), xtracbits, rounding, ckpce, async_reset); // }}} // The binary multiply the hardware assisted multiply depends on // {{{ { - fname = coredir + "/longbimpy.v"; - build_longbimpy(fname.c_str()); - fname = coredir + "/bimpy.v"; - build_bimpy(fname.c_str()); + fname = coredir + "/" + prefix + "longbimpy.v"; + build_longbimpy(fname.c_str(), prefix.c_str()); + fname = coredir + "/" + prefix + "bimpy.v"; + build_bimpy(fname.c_str(), prefix.c_str()); } // }}} // Quarter stage // {{{ if ((dbg)&&(dbgstage == 4)) { - fname = coredir + "/qtrstage_dbg.v"; + fname = coredir + "/" + prefix + "qtrstage_dbg.v"; if (single_clock) - build_snglquarters(fname.c_str(), rounding, + build_snglquarters(fname.c_str(), prefix.c_str(), rounding, async_reset, true); else - build_dblquarters(fname.c_str(), rounding, + build_dblquarters(fname.c_str(), prefix.c_str(),rounding, async_reset, true); } - fname = coredir + "/qtrstage.v"; + fname = coredir + "/" + prefix + "qtrstage.v"; if (single_clock) - build_snglquarters(fname.c_str(), rounding, + build_snglquarters(fname.c_str(), prefix.c_str(), rounding, async_reset, false); else - build_dblquarters(fname.c_str(), rounding, + build_dblquarters(fname.c_str(), prefix.c_str(), rounding, async_reset, false); // }}} // Last stage // {{{ if (single_clock) { - fname = coredir + "/laststage.v"; - build_sngllast(fname.c_str(), async_reset); + fname = coredir + "/" + prefix + "laststage.v"; + build_sngllast(fname.c_str(), prefix.c_str(), async_reset); } else { if ((dbg)&&(dbgstage == 2)) - fname = coredir + "/laststage_dbg.v"; + fname = coredir + "/" + prefix + "laststage_dbg.v"; else - fname = coredir + "/laststage.v"; - build_dblstage(fname.c_str(), rounding, + fname = coredir + "/" + prefix + "laststage.v"; + build_dblstage(fname.c_str(), prefix.c_str(), rounding, async_reset, (dbg)&&(dbgstage==2)); } // }}} @@ -2491,7 +2516,7 @@ SLASHLINE // Bit reversal logic // {{{ if (bitreverse) { - fname = coredir + "/bitreverse.v"; + fname = coredir + "/" + prefix + "bitreverse.v"; if (single_clock) build_snglbrev(fname.c_str(), async_reset); else @@ -2501,20 +2526,20 @@ SLASHLINE // Rounding // {{{ - const char *rnd_string = ""; + std::string rnd_string = ""; switch(rounding) { - case RND_TRUNCATE: rnd_string = "/truncate.v"; break; - case RND_FROMZERO: rnd_string = "/roundfromzero.v"; break; - case RND_HALFUP: rnd_string = "/roundhalfup.v"; break; + case RND_TRUNCATE: rnd_string = "/" + prefix + "truncate.v"; break; + case RND_FROMZERO: rnd_string = "/" + prefix + "roundfromzero.v"; break; + case RND_HALFUP: rnd_string = "/" + prefix + "roundhalfup.v"; break; default: - rnd_string = "/convround.v"; break; + rnd_string = "/" + prefix + "convround.v"; break; } fname = coredir + rnd_string; switch(rounding) { - case RND_TRUNCATE: build_truncator(fname.c_str()); break; - case RND_FROMZERO: build_roundfromzero(fname.c_str()); break; - case RND_HALFUP: build_roundhalfup(fname.c_str()); break; + case RND_TRUNCATE: build_truncator(fname.c_str(), prefix.c_str()); break; + case RND_FROMZERO: build_roundfromzero(fname.c_str(), prefix.c_str()); break; + case RND_HALFUP: build_roundhalfup(fname.c_str(), prefix.c_str()); break; default: - build_convround(fname.c_str()); break; + build_convround(fname.c_str(), prefix.c_str()); break; } // }}} } diff --git a/sw/rounding.cpp b/sw/rounding.cpp index 9c1f8c3..4718a24 100644 --- a/sw/rounding.cpp +++ b/sw/rounding.cpp @@ -55,7 +55,7 @@ // build_truncator // {{{ -void build_truncator(const char *fname) { +void build_truncator(const char *fname, const char* prefix) { printf("TRUNCATING!\n"); FILE *fp = fopen(fname, "w"); if (NULL == fp) { @@ -91,7 +91,8 @@ SLASHLINE fprintf(fp, "%s", cpyleft); fprintf(fp, "//\n//\n`default_nettype\tnone\n//\n"); fprintf(fp, -"module truncate(i_clk, i_ce, i_val, o_val);\n" +"module %struncate(i_clk, i_ce, i_val, o_val);\n", prefix); + fprintf(fp, "\tparameter\tIWID=16, OWID=8, SHIFT=0;\n" "\tinput\twire\t\t\t\ti_clk, i_ce;\n" "\tinput\twire\tsigned\t[(IWID-1):0]\ti_val;\n" @@ -107,7 +108,7 @@ SLASHLINE // build_roundhalfup // {{{ -void build_roundhalfup(const char *fname) { +void build_roundhalfup(const char *fname, const char* prefix) { FILE *fp = fopen(fname, "w"); if (NULL == fp) { fprintf(stderr, "Could not open \'%s\' for writing\n", fname); @@ -135,7 +136,8 @@ SLASHLINE fprintf(fp, "%s", cpyleft); fprintf(fp, "//\n//\n`default_nettype\tnone\n//\n"); fprintf(fp, -"module roundhalfup(i_clk, i_ce, i_val, o_val);\n" +"module %sroundhalfup(i_clk, i_ce, i_val, o_val);\n", prefix); + fprintf(fp, "\tparameter\tIWID=16, OWID=8, SHIFT=0;\n" "\tinput\twire\t\t\t\ti_clk, i_ce;\n" "\tinput\twire\tsigned\t[(IWID-1):0]\ti_val;\n" @@ -181,7 +183,7 @@ SLASHLINE // build_roundfromzero // {{{ -void build_roundfromzero(const char *fname) { +void build_roundfromzero(const char *fname, const char* prefix) { FILE *fp = fopen(fname, "w"); if (NULL == fp) { fprintf(stderr, "Could not open \'%s\' for writing\n", fname); @@ -217,7 +219,8 @@ SLASHLINE fprintf(fp, "%s", cpyleft); fprintf(fp, "//\n//\n`default_nettype\tnone\n//\n"); fprintf(fp, -"module roundfromzero(i_clk, i_ce, i_val, o_val);\n" +"module %sroundfromzero(i_clk, i_ce, i_val, o_val);\n", prefix); + fprintf(fp, "\tparameter\tIWID=16, OWID=8, SHIFT=0;\n" "\tinput\twire\t\t\t\ti_clk, i_ce;\n" "\tinput\twire\tsigned\t[(IWID-1):0]\ti_val;\n" @@ -305,7 +308,7 @@ SLASHLINE // build_convround // {{{ -void build_convround(const char *fname) { +void build_convround(const char *fname, const char* prefix) { FILE *fp = fopen(fname, "w"); if (NULL == fp) { fprintf(stderr, "Could not open \'%s\' for writing\n", fname); @@ -334,7 +337,8 @@ SLASHLINE fprintf(fp, "%s", cpyleft); fprintf(fp, "//\n//\n`default_nettype\tnone\n//\n"); fprintf(fp, -"module convround(i_clk, i_ce, i_val, o_val);\n" +"module %sconvround(i_clk, i_ce, i_val, o_val);\n", prefix); + fprintf(fp, "\tparameter\tIWID=16, OWID=8, SHIFT=0;\n" "\tinput\twire\t\t\t\ti_clk, i_ce;\n" "\tinput\twire\tsigned\t[(IWID-1):0]\ti_val;\n" diff --git a/sw/rounding.h b/sw/rounding.h index 9e12fe1..1a4359e 100644 --- a/sw/rounding.h +++ b/sw/rounding.h @@ -45,9 +45,9 @@ typedef enum { } ROUND_T; -extern void build_truncator(const char *fname); -extern void build_roundhalfup(const char *fname); -extern void build_roundfromzero(const char *fname); -extern void build_convround(const char *fname); +extern void build_truncator(const char *fname, const char* prefix); +extern void build_roundhalfup(const char *fname, const char* prefix); +extern void build_roundfromzero(const char *fname, const char* prefix); +extern void build_convround(const char *fname, const char* prefix); #endif diff --git a/sw/softmpy.cpp b/sw/softmpy.cpp index 4dc8f1e..0716ebe 100644 --- a/sw/softmpy.cpp +++ b/sw/softmpy.cpp @@ -62,7 +62,7 @@ // build_multiply // {{{ -void build_multiply(const char *fname) { +void build_multiply(const char *fname, const char* prefix) { FILE *fp = fopen(fname, "w"); if (NULL == fp) { fprintf(stderr, "Could not open \'%s\' for writing\n", fname); @@ -100,8 +100,8 @@ SLASHLINE fprintf(fp, "%s", cpyleft); fprintf(fp, "//\n//\n`default_nettype\tnone\n//\n"); fprintf(fp, -"module shiftaddmpy(i_clk, i_ce, i_a, i_b, o_r);\n" - "\tparameter\tAWIDTH=%d,BWIDTH=", TST_SHIFTADDMPY_AW); +"module %sshiftaddmpy(i_clk, i_ce, i_a, i_b, o_r);\n" + "\tparameter\tAWIDTH=%d,BWIDTH=", prefix, TST_SHIFTADDMPY_AW); #ifdef TST_SHIFTADDMPY_BW fprintf(fp, "%d;\n", TST_SHIFTADDMPY_BW); #else @@ -171,7 +171,7 @@ SLASHLINE // build_bimpy -- the binary sub-multiply (everything else is addition) // {{{ -void build_bimpy(const char *fname) { +void build_bimpy(const char *fname, const char* prefix) { FILE *fp = fopen(fname, "w"); if (NULL == fp) { fprintf(stderr, "Could not open \'%s\' for writing\n", fname); @@ -205,7 +205,8 @@ SLASHLINE fprintf(fp, "%s", cpyleft); fprintf(fp, "//\n//\n`default_nettype\tnone\n//\n"); fprintf(fp, -"module bimpy #(\n" // (i_clk, i_reset, i_ce, i_a, i_b, o_r);\n" +"module %sbimpy #(\n", prefix); // (i_clk, i_reset, i_ce, i_a, i_b, o_r);\n" + fprintf(fp, "\t\t// {{{\n" "\t\tparameter\tBW=18, // Number of bits in i_b\n" "\t\tlocalparam\tLUTB=2 // Number of bits in i_a for our LUT multiply\n" @@ -308,7 +309,7 @@ SLASHLINE // build_longbimpy // {{{ -void build_longbimpy(const char *fname) { +void build_longbimpy(const char *fname, const char* prefix) { FILE *fp = fopen(fname, "w"); if (NULL == fp) { fprintf(stderr, "Could not open \'%s\' for writing\n", fname); @@ -339,7 +340,7 @@ SLASHLINE fprintf(fp, "%s", cpyleft); fprintf(fp, "//\n//\n`default_nettype\tnone\n//\n"); fprintf(fp, -"module longbimpy #(\n"); +"module %slongbimpy #(\n", prefix); fprintf(fp, "\t\t// {{{\n" "\t\tparameter IAW=%d, // The width of i_a, min width is 5\n" diff --git a/sw/softmpy.h b/sw/softmpy.h index a5820d0..e893e80 100644 --- a/sw/softmpy.h +++ b/sw/softmpy.h @@ -41,8 +41,8 @@ #ifndef SOFTMPY_H #define SOFTMPY_H -extern void build_multiply(const char *fname); -extern void build_bimpy(const char *fname); -extern void build_longbimpy(const char *fname); +extern void build_multiply(const char *fname, const char* prefix); +extern void build_bimpy(const char *fname, const char* prefix); +extern void build_longbimpy(const char *fname, const char* prefix); #endif // SOFTMPY_H