Skip to content

Commit

Permalink
Merge branch 'YosysHQ:main' into main
Browse files Browse the repository at this point in the history
  • Loading branch information
akashlevy authored Jan 7, 2025
2 parents 432db63 + d374496 commit 443613d
Show file tree
Hide file tree
Showing 4 changed files with 75 additions and 12 deletions.
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,7 @@ ifeq ($(OS), Haiku)
CXXFLAGS += -D_DEFAULT_SOURCE
endif

YOSYS_VER := 0.48+51
YOSYS_VER := 0.48+57

# Note: We arrange for .gitcommit to contain the (short) commit hash in
# tarballs generated with git-archive(1) using .gitattributes. The git repo
Expand Down
11 changes: 0 additions & 11 deletions docs/source/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -7,17 +7,6 @@ see :doc:`/introduction`. For a quick guide on how to get started using Yosys,
check out :doc:`/getting_started/index`. For the complete list of commands
available, go to :ref:`commandindex`.

.. note::

This documentation recently went through a major restructure. If you're
looking for something from the previous version and can't find it here,
please `let us know`_. Documentation from before the restructure can still
be found by switching to `version 0.36`_ or earlier. Note that the previous
theme does not include a version switcher.

.. _let us know: https://github.com/YosysHQ/yosys/issues/new/choose
.. _version 0.36: https://yosyshq.readthedocs.io/projects/yosys/en/0.36/

.. todo:: look into command ref improvements

- Search bar with live drop down suggestions for matching on title /
Expand Down
52 changes: 52 additions & 0 deletions passes/opt/wreduce.cc
Original file line number Diff line number Diff line change
Expand Up @@ -263,6 +263,19 @@ struct WreduceWorker
}
}

int reduced_opsize(const SigSpec &inp, bool signed_)
{
int size = GetSize(inp);
if (signed_) {
while (size >= 2 && inp[size - 1] == inp[size - 2])
size--;
} else {
while (size >= 1 && inp[size - 1] == State::S0)
size--;
}
return size;
}

void run_cell(Cell *cell)
{
bool did_something = false;
Expand Down Expand Up @@ -295,6 +308,45 @@ struct WreduceWorker
bool port_a_signed = false;
bool port_b_signed = false;

// For some operations if the output is no wider than either of the inputs
// we are free to choose the signedness of the operands
if (cell->type.in(ID($mul), ID($add), ID($sub)) &&
max_port_a_size == GetSize(sig) &&
max_port_b_size == GetSize(sig)) {
SigSpec sig_a = mi.sigmap(cell->getPort(ID::A)), sig_b = mi.sigmap(cell->getPort(ID::B));

// Remove top bits from sig_a and sig_b which are not visible on the output
sig_a.extend_u0(max_port_a_size);
sig_b.extend_u0(max_port_b_size);

int signed_cost, unsigned_cost;
if (cell->type == ID($mul)) {
signed_cost = reduced_opsize(sig_a, true) * reduced_opsize(sig_b, true);
unsigned_cost = reduced_opsize(sig_a, false) * reduced_opsize(sig_b, false);
} else {
signed_cost = max(reduced_opsize(sig_a, true), reduced_opsize(sig_b, true));
unsigned_cost = max(reduced_opsize(sig_a, false), reduced_opsize(sig_b, false));
}

if (!port_a_signed && !port_b_signed && signed_cost < unsigned_cost) {
log("Converting cell %s.%s (%s) from unsigned to signed.\n",
log_id(module), log_id(cell), log_id(cell->type));
cell->setParam(ID::A_SIGNED, 1);
cell->setParam(ID::B_SIGNED, 1);
port_a_signed = true;
port_b_signed = true;
did_something = true;
} else if (port_a_signed && port_b_signed && unsigned_cost < signed_cost) {
log("Converting cell %s.%s (%s) from signed to unsigned.\n",
log_id(module), log_id(cell), log_id(cell->type));
cell->setParam(ID::A_SIGNED, 0);
cell->setParam(ID::B_SIGNED, 0);
port_a_signed = false;
port_b_signed = false;
did_something = true;
}
}

if (max_port_a_size >= 0 && cell->type != ID($shiftx))
run_reduce_inport(cell, 'A', max_port_a_size, port_a_signed, did_something);

Expand Down
22 changes: 22 additions & 0 deletions tests/various/wreduce2.ys
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
read_verilog <<EOF
module top(a, b, y);
parameter awidth = 6;
parameter bwidth = 8;
parameter ywidth = 14;

input [awidth-1:0] a;
input [bwidth-1:0] b;
output [ywidth-1:0] y;

wire [ywidth-1:0] aext = {{(ywidth-awidth){a[awidth-1]}}, a};
wire [ywidth-1:0] bext = {{(ywidth-bwidth){b[bwidth-1]}}, b};

assign y = aext*bext;
endmodule
EOF

opt_clean
wreduce
select -assert-count 1 t:$mul
select -assert-count 1 t:$mul r:A_SIGNED=1 r:B_SIGNED=1 %i %i
select -assert-count 1 t:$mul r:A_WIDTH=6 r:B_WIDTH=8 %i %i

0 comments on commit 443613d

Please sign in to comment.