diff --git a/kernel/satgen.h b/kernel/satgen.h index fcbdcc147..05afeabf5 100644 --- a/kernel/satgen.h +++ b/kernel/satgen.h @@ -92,6 +92,15 @@ struct SatGen vec_y.push_back(ez->literal()); } + void extendSignalWidthUnary(std::vector &vec_a, std::vector &vec_y, RTLIL::Cell *cell) + { + bool is_signed = cell->parameters.count("\\A_SIGNED") > 0 && cell->parameters["\\A_SIGNED"].as_bool(); + while (vec_a.size() < vec_y.size()) + vec_a.push_back(is_signed && vec_a.size() > 0 ? vec_a.back() : ez->FALSE); + while (vec_y.size() < vec_a.size()) + vec_y.push_back(ez->literal()); + } + bool importCell(RTLIL::Cell *cell, int timestep = -1) { if (cell->type == "$_AND_" || cell->type == "$_OR_" || cell->type == "$_XOR_" || @@ -151,6 +160,7 @@ struct SatGen if (cell->type == "$pos" || cell->type == "$neg") { std::vector a = importSigSpec(cell->connections.at("\\A"), timestep); std::vector y = importSigSpec(cell->connections.at("\\Y"), timestep); + extendSignalWidthUnary(a, y, cell); if (cell->type == "$pos") { ez->assume(ez->vec_eq(a, y)); } else { diff --git a/tests/xsthammer/generate.cc b/tests/xsthammer/generate.cc index b1ec95088..3fa14de0a 100644 --- a/tests/xsthammer/generate.cc +++ b/tests/xsthammer/generate.cc @@ -1,4 +1,7 @@ +#define GENERATE_BINARY_OPS +#define GENERATE_UNARY_OPS + #include #include #include @@ -67,8 +70,7 @@ int main() { mkdir("rtl", 0777); - // generate test cases for binary operators - +#ifdef GENERATE_BINARY_OPS for (int ai = 0; ai < sizeof(arg_types)/sizeof(arg_types[0]); ai++) for (int bi = 0; bi < sizeof(arg_types)/sizeof(arg_types[0]); bi++) for (int yi = 0; yi < sizeof(arg_types)/sizeof(arg_types[0]); yi++) @@ -111,9 +113,9 @@ int main() fprintf(f, "endmodule\n"); fclose(f); } +#endif - // generate test cases for unary operators - +#ifdef GENERATE_UNARY_OPS for (int ai = 0; ai < sizeof(arg_types)/sizeof(arg_types[0]); ai++) for (int yi = 0; yi < sizeof(arg_types)/sizeof(arg_types[0]); yi++) for (int oi = 0; oi < sizeof(unary_ops)/sizeof(unary_ops[0]); oi++) @@ -140,12 +142,14 @@ int main() FILE *f = fopen(buffer, "w"); fprintf(f, "module unary_ops_%02d%02d%02d(a, b, y);\n", ai, yi, oi); fprintf(f, "%s;\n", a_decl.c_str()); + fprintf(f, "input b;\n"); fprintf(f, "%s;\n", y_decl.c_str()); fprintf(f, "assign %s = %s %s;\n", y_ref.c_str(), unary_ops[oi], a_ref.c_str()); fprintf(f, "endmodule\n"); fclose(f); } +#endif return 0; }