Skip to content

Commit 882001c

Browse files
committed
cellaigs: fix adder function argument evaluation order
1 parent 7f3ea41 commit 882001c

File tree

1 file changed

+10
-5
lines changed

1 file changed

+10
-5
lines changed

kernel/cellaigs.cc

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -231,17 +231,22 @@ struct AigMaker
231231
return or_gate(a_active, b_active);
232232
}
233233

234-
vector<int> adder(const vector<int> &A, const vector<int> &B, int carry, vector<int> *X = nullptr, vector<int> *CO = nullptr)
234+
vector<int> adder(const vector<int> &A, const vector<int> &B, int carry_in, vector<int> *X = nullptr, vector<int> *CO = nullptr)
235235
{
236236
vector<int> Y(GetSize(A));
237237
log_assert(GetSize(A) == GetSize(B));
238238
for (int i = 0; i < GetSize(A); i++) {
239-
Y[i] = xor_gate(xor_gate(A[i], B[i]), carry);
240-
carry = or_gate(and_gate(A[i], B[i]), and_gate(or_gate(A[i], B[i]), carry));
239+
int a_xor_b = xor_gate(A[i], B[i]);
240+
int a_or_b = or_gate(A[i], B[i]);
241+
int a_and_b = and_gate(A[i], B[i]);
242+
Y[i] = xor_gate(a_xor_b, carry_in);
243+
int tmp = and_gate(a_or_b, carry_in);
244+
int carry_out = or_gate(a_and_b, tmp);
241245
if (X != nullptr)
242-
X->at(i) = xor_gate(A[i], B[i]);
246+
X->at(i) = a_xor_b;
243247
if (CO != nullptr)
244-
CO->at(i) = carry;
248+
CO->at(i) = carry_out;
249+
carry_in = carry_out;
245250
}
246251
return Y;
247252
}

0 commit comments

Comments
 (0)