From bf2c149329b8823157a346301525e952ddf268e0 Mon Sep 17 00:00:00 2001 From: Clifford Wolf Date: Wed, 12 Jun 2013 19:09:14 +0200 Subject: Another fix for a bug found using xsthammer --- kernel/satgen.h | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'kernel') 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 { -- cgit v1.2.3