naive acec

This commit is contained in:
YuhangQ 2022-10-23 17:07:24 +08:00
parent 53916eb422
commit 4006e9ffa1
4 changed files with 883 additions and 494 deletions

469
acec.cpp
View File

@ -3,10 +3,19 @@
#include "circuit.h"
#include "polynomial.h"
Var* pvar(int id) {
static std::map<int, Var*> mp;
if(mp.count(id)) return mp[id];
std::string name = "A" + std::to_string(abs(id));
if(id < 0) name = "N" + name;
Var* var = new Var(name.c_str(), id > 0 ? Gates[id].topo_index : (100000 + id) );
return mp[id] = var;
}
bool subsitute(Polynomial* &a, Polynomial* b) {
Polynomial* result = divide_by_term(a, b->get_lt());
auto ltm = new Monomial(minus_one, b->get_lt());
@ -14,10 +23,8 @@ bool subsitute(Polynomial* &a, Polynomial* b) {
auto ltp = build_poly();
Polynomial* to_minus = multiply_poly(result, ltp);
Polynomial* new_result = add_poly(a, to_minus);
for(int i=1; i<b->size(); i++) {
push_mstack_end(b->get_mon(i));
@ -25,12 +32,10 @@ bool subsitute(Polynomial* &a, Polynomial* b) {
Polynomial* tail = build_poly();
Polynomial* new_tail = multiply_poly(result, tail);
mpz_t c; mpz_init(c);
mpz_mul(c, b->get_mon(0)->coeff, minus_one);
Polynomial* tail_with_c = multiply_poly_with_constant(new_tail, c);
Polynomial* done = add_poly(tail_with_c, new_result);
@ -49,112 +54,67 @@ bool subsitute(Polynomial* &a, Polynomial* b) {
return result->is_constant_zero_poly();
}
// void getPolyOfGate(Sweep* s, int gateid, Polynomial* &resultA, Polynomial* &resultB) {
// circuit *c = &(s->C[abs(gateid)]);
// gateid = abs(gateid) * (c->neg ? -1 : 1);
// if(c->type == And) {
// add_to_vstack(pvar(gateid));
// push_mstack(new Monomial(minus_one, build_term_from_stack()));
// for(int i=0; i<c->sz; i++) {
// add_to_vstack(pvar(c->to[i]));
// }
// push_mstack(new Monomial(one, build_term_from_stack()));
// resultA = build_poly();
// } else if(c->type == Xor) {
// add_to_vstack(pvar(gateid));
// push_mstack(new Monomial(minus_one, build_term_from_stack()));
// add_to_vstack(pvar(c->to[0]));
// add_to_vstack(pvar(c->to[1]));
// push_mstack(new Monomial(minus_two, build_term_from_stack()));
// add_to_vstack(pvar(c->to[0]));
// push_mstack(new Monomial(one, build_term_from_stack()));
// add_to_vstack(pvar(c->to[1]));
// push_mstack(new Monomial(one, build_term_from_stack()));
// resultA = build_poly();
// } else if(c->type == HA) {
// add_to_vstack(pvar(gateid));
// push_mstack(new Monomial(minus_one, build_term_from_stack()));
// add_to_vstack(pvar(c->to[0]));
// add_to_vstack(pvar(c->to[1]));
// push_mstack(new Monomial(minus_two, build_term_from_stack()));
// add_to_vstack(pvar(c->to[0]));
// push_mstack(new Monomial(one, build_term_from_stack()));
// add_to_vstack(pvar(c->to[1]));
// push_mstack(new Monomial(one, build_term_from_stack()));
// resultA = build_poly();
void poly_mod2(Polynomial* &p) {
for(int i=0; i<p->num_mon; i++) {
Monomial* m = p->get_mon(i);
mpz_mod_ui(m->coeff, m->coeff, 2);
mpz_add_ui(m->coeff, m->coeff, 2);
mpz_mod_ui(m->coeff, m->coeff, 2);
if(mpz_cmp_ui(m->coeff, 0) != 0) {
push_mstack(m);
}
}
p = build_poly();
}
// add_to_vstack(pvar(c->carrier));
// push_mstack(new Monomial(minus_one, build_term_from_stack()));
// for(int i=0; i<c->sz; i++) {
// add_to_vstack(pvar(c->to[i]));
// }
// push_mstack(new Monomial(one, build_term_from_stack()));
// resultB = build_poly();
// } else if(c->type == FA) {
// add_to_vstack(pvar(gateid));
// push_mstack(new Monomial(minus_one, build_term_from_stack()));
// add_to_vstack(pvar(c->to[0]));
// push_mstack(new Monomial(one, build_term_from_stack()));
// add_to_vstack(pvar(c->to[1]));
// push_mstack(new Monomial(one, build_term_from_stack()));
// add_to_vstack(pvar(c->to[2]));
// push_mstack(new Monomial(one, build_term_from_stack()));
// add_to_vstack(pvar(c->to[0]));
// add_to_vstack(pvar(c->to[1]));
// push_mstack(new Monomial(minus_two, build_term_from_stack()));
// add_to_vstack(pvar(c->to[1]));
// add_to_vstack(pvar(c->to[2]));
// push_mstack(new Monomial(minus_two, build_term_from_stack()));
// add_to_vstack(pvar(c->to[0]));
// add_to_vstack(pvar(c->to[2]));
// push_mstack(new Monomial(minus_two, build_term_from_stack()));
// add_to_vstack(pvar(c->to[0]));
// add_to_vstack(pvar(c->to[1]));
// add_to_vstack(pvar(c->to[2]));
// push_mstack(new Monomial(four, build_term_from_stack()));
// resultA = build_poly();
// add_to_vstack(pvar(c->carrier));
// push_mstack(new Monomial(minus_one, build_term_from_stack()));
// add_to_vstack(pvar(c->to[0]));
// add_to_vstack(pvar(c->to[1]));
// push_mstack(new Monomial(one, build_term_from_stack()));
// add_to_vstack(pvar(c->to[0]));
// add_to_vstack(pvar(c->to[2]));
// push_mstack(new Monomial(one, build_term_from_stack()));
// add_to_vstack(pvar(c->to[1]));
// add_to_vstack(pvar(c->to[2]));
// push_mstack(new Monomial(one, build_term_from_stack()));
// add_to_vstack(pvar(c->to[0]));
// add_to_vstack(pvar(c->to[1]));
// add_to_vstack(pvar(c->to[2]));
// push_mstack(new Monomial(minus_two, build_term_from_stack()));
// resultB = build_poly();
// } else if(c->type == Majority) {
// add_to_vstack(pvar(gateid));
// push_mstack(new Monomial(minus_one, build_term_from_stack()));
// add_to_vstack(pvar(c->to[0]));
// add_to_vstack(pvar(c->to[1]));
// push_mstack(new Monomial(one, build_term_from_stack()));
// add_to_vstack(pvar(c->to[0]));
// add_to_vstack(pvar(c->to[2]));
// push_mstack(new Monomial(one, build_term_from_stack()));
// add_to_vstack(pvar(c->to[1]));
// add_to_vstack(pvar(c->to[2]));
// push_mstack(new Monomial(one, build_term_from_stack()));
// add_to_vstack(pvar(c->to[0]));
// add_to_vstack(pvar(c->to[1]));
// add_to_vstack(pvar(c->to[2]));
// push_mstack(new Monomial(minus_two, build_term_from_stack()));
// resultA = build_poly();
// }
// }
Polynomial* getPolyOfGate(int id) {
CircuitGate gate = Gates[id];
if(gate.type == AND) {
add_to_vstack(pvar(id));
push_mstack(new Monomial(minus_one, build_term_from_stack()));
for(auto& in : gate.inputs) {
add_to_vstack(pvar(in));
}
push_mstack(new Monomial(one, build_term_from_stack()));
return build_poly();
}
if(gate.type == XOR) {
add_to_vstack(pvar(id));
push_mstack(new Monomial(minus_one, build_term_from_stack()));
for(auto& in : gate.inputs) {
add_to_vstack(pvar(in));
push_mstack(new Monomial(one, build_term_from_stack()));
}
return build_poly();
}
if(gate.type == MAJ) {
add_to_vstack(pvar(id));
push_mstack(new Monomial(minus_one, build_term_from_stack()));
add_to_vstack(pvar(gate.inputs[0]));
add_to_vstack(pvar(gate.inputs[1]));
push_mstack(new Monomial(one, build_term_from_stack()));
add_to_vstack(pvar(gate.inputs[0]));
add_to_vstack(pvar(gate.inputs[2]));
push_mstack(new Monomial(one, build_term_from_stack()));
add_to_vstack(pvar(gate.inputs[1]));
add_to_vstack(pvar(gate.inputs[2]));
push_mstack(new Monomial(one, build_term_from_stack()));
return build_poly();
}
if(gate.type == OR) {
assert(gate.inputs.size() == 2);
add_to_vstack(pvar(id));
push_mstack(new Monomial(minus_one, build_term_from_stack()));
add_to_vstack(pvar(gate.inputs[0]));
push_mstack(new Monomial(one, build_term_from_stack()));
add_to_vstack(pvar(gate.inputs[1]));
push_mstack(new Monomial(one, build_term_from_stack()));
add_to_vstack(pvar(gate.inputs[0]));
add_to_vstack(pvar(gate.inputs[1]));
push_mstack(new Monomial(one, build_term_from_stack()));
return build_poly();
}
}
bool poly_cmp(Polynomial *a, Polynomial *b) {
return a->get_lt()->get_var()->get_level() > b->get_lt()->get_var()->get_level();
@ -177,272 +137,49 @@ int main(int argv, char* args[]) {
read_verilog_from_file("test.v");
print_circuit_structure();
// std::map<std::string, Polynomial*> nas;
// for(int i=1; i<=S->maxvar; i++) {
// add_to_vstack(pvar(i));
// push_mstack(new Monomial(one, build_term_from_stack()));
// add_to_vstack(pvar(-i));
// push_mstack(new Monomial(one, build_term_from_stack()));
// push_mstack(new Monomial(minus_one, build_term_from_stack()));
// Polynomial *poly = build_poly();
// nas[pvar(-i)->get_name()] = poly;
// nas[pvar(i)->get_name()] = poly;
// }
std::map<std::string, Polynomial*> nas;
for(int i=1; i<=circuit_output; i++) {
add_to_vstack(pvar(-i));
push_mstack(new Monomial(one, build_term_from_stack()));
add_to_vstack(pvar(i));
push_mstack(new Monomial(one, build_term_from_stack()));
push_mstack(new Monomial(minus_one, build_term_from_stack()));
Polynomial *poly = build_poly();
nas[pvar(-i)->get_name()] = poly;
nas[pvar(i)->get_name()] = poly;
}
// std::vector<Polynomial*> polys;
std::vector<Polynomial*> polys;
// std::set<int> reserved_vars;
// std::vector<Polynomial*> subsitute_vars;
// for (int i = 1; i <= S->maxvar; i++) {
// circuit *c = &(S->C[i]);
// if (!c->sz || S->del[i] == 2) continue;
// if(c->type == Xor) {
// reserved_vars.insert(i);
// // for(int j=0; j<c->sz; j++)
// // reserved_vars.insert(abs(c->to[j]));
// }
// }
// for (int i = 1; i <= S->maxvar; i++) {
// circuit *c = &(S->C[i]);
// if (!c->sz || S->del[i] == 2) continue;
// if(!reserved_vars.count(i)) {
// Polynomial *p, *q;
// getPolyOfGate(S, i, p, q);
// while(p->get_lt()->get_var_name()[0] == 'N') {
// Polynomial *to_div = nas[p->get_lt()->get_var_name()];
// subsitute(p, to_div);
// }
// subsitute_vars.push_back(p);
// }
// }
for (int i = 1; i <= circuit_output; i++) {
// printf("reserved: %d ; subsitute: %d\n", reserved_vars.size(), subsitute_vars.size());
Polynomial *result = getPolyOfGate(i);
// for (int i = 1; i <= S->maxvar; i++) {
// circuit *c = &(S->C[i]);
// if (!c->sz || S->del[i] == 2) continue;
// }
printf(" original:\t"); result->print(stdout);
// for (int i = 1; i <= S->maxvar; i++) {
// circuit *c = &(S->C[i]);
// if (!c->sz || S->del[i] == 2) continue;
while(result->get_lt()->get_var_name()[0] == 'N') {
Polynomial *to_div = nas[result->get_lt()->get_var_name()];
subsitute(result, to_div);
}
// if(!reserved_vars.count(i)) continue;
printf(" pos-var:\t"); result->print(stdout);
// //if(c->sz == 2 && abs(c->to[0]) <= 14 && abs(c->to[1]) <= 14) continue;
polys.push_back(result);
}
// Polynomial *resultA, *resultB = nullptr;
// getPolyOfGate(S, i, resultA, resultB);
add_to_vstack(pvar(circuit_output));
push_mstack(new Monomial(one, build_term_from_stack()));
// printf(" original:\t"); resultA->print(stdout);
Polynomial *result = build_poly();
// while(resultA->get_lt()->get_var_name()[0] == 'N') {
// Polynomial *to_div = nas[resultA->get_lt()->get_var_name()];
// subsitute(resultA, to_div);
// }
std::sort(polys.begin(), polys.end(), poly_cmp);
// printf(" pos-var:\t"); resultA->print(stdout);
// for(auto subs : subsitute_vars) {
// //printf("delete: "); subs->print(stdout);
// subsitute(resultA, subs);
// }
// printf(" xor-relative:\t"); resultA->print(stdout);
// polys.push_back(resultA);
// if (c->type == HA || c->type == FA) {
// printf("( %d %d )", i * (S->C[i].neg ? -1 : 1), c->carrier);
// }
// else {
// printf("%d", i * (S->C[i].neg ? -1 : 1));
// }
// printf(" = %s ( ", gate_type[c->type].c_str());
// for (int j = 0; j < c->sz; j++) {
// printf("%d ", c->to[j]);
// }
// puts(")");
// }
// add_to_vstack(pvar(32));
// push_mstack(new Monomial(one, build_term_from_stack()));
// Polynomial *result = build_poly();
// std::sort(polys.begin(), polys.end(), poly_cmp);
// for(auto p : polys) {
// printf("now: "); result->print(stdout);
// printf("div: "); p->print(stdout);
// subsitute(result, p);
// }
for(auto p : polys) {
printf("now: "); result->print(stdout);
printf("div: "); p->print(stdout);
subsitute(result, p);
poly_mod2(result);
}
return 0;
}
// for (int i = 1; i <= S->maxvar; i++) {
// circuit *c = &(S->C[i]);
// if (!c->sz || S->del[i] == 2) continue;
// if(c->type == And) {
// char term[1024];
// sprintf(term, "-%s+%s", pvar(i * (S->C[i].neg ? -1 : 1)), pvar(c->to[0]));
// for(int i=1; i<c->sz; i++) {
// sprintf(term, "%s*%s", term, pvar(c->to[i]));
// }
// polynomialArray.push_back(term);
// printf("%s\n", term);
// }
// if(c->type == Xor) {
// string last = pvar(c->to[0]);
// char term[1024];
// for(int i=1; i<c->sz-1; i++) {
// string tmp = pvar(++t);
// sprintf(term, "-%s-2*%s*%s+%s+%s", tmp.c_str(), last.c_str(), pvar(c->to[i]), last.c_str(), pvar(c->to[i]));
// polynomialArray.push_back(term);
// printf("%s\n", term);
// last = tmp;
// }
// sprintf(term, "-%s-2*%s*%s+%s+%s", pvar(i * (S->C[i].neg ? -1 : 1)), last.c_str(), pvar(c->to[c->sz-1]), last.c_str(), pvar(c->to[c->sz-1]));
// polynomialArray.push_back(term);
// printf("%s\n", term);
// }
// if (c->type == HA || c->type == FA) {
// char term[1024];
// sprintf(term, "-%s-2*%s+%s", pvar(i * (S->C[i].neg ? -1 : 1)), pvar(c->carrier), pvar(c->to[0]));
// for(int i=1; i<c->sz; i++) {
// sprintf(term, "%s+%s", term, pvar(c->to[i]));
// }
// polynomialArray.push_back(term);
// printf("%s\n", term);
// }
// if(c->type == Majority) {
// char term[1024];
// sprintf(term, "-%s-2*%s+%s", pvar(++t), pvar(i * (S->C[i].neg ? -1 : 1)), pvar(c->to[0]));
// for(int i=1; i<c->sz; i++) {
// sprintf(term, "%s+%s", term, pvar(c->to[i]));
// }
// polynomialArray.push_back(term);
// printf("%s\n", term);
// }
// if (c->type == HA || c->type == FA) {
// printf("( %d %d )", i * (S->C[i].neg ? -1 : 1), c->carrier);
// }
// else {
// printf("%d", i * (S->C[i].neg ? -1 : 1));
// }
// printf(" = %s ( ", gate_type[c->type].c_str());
// for (int j = 0; j < c->sz; j++) {
// printf("%d ", c->to[j]);
// }
// puts(")");
// }
// for(int i=t; i>=1; i--) {
// variableName.push_back(pvar(i));
// variableName.push_back(pvar(-i));
// char term[1024];
// sprintf(term, "-%s+%s^2", pvar(i), pvar(i));
// polynomialArray.emplace_back(term);
// printf("%s\n", term);
// sprintf(term, "%s+%s", pvar(i), pvar(-i));
// polynomialArray.emplace_back(term);
// printf("%s\n", term);
// }
// char term[1024];
// sprintf(term, "-%s+1", pvar(S->maxvar));
// polynomialArray.emplace_back(term);
// printf("%s\n", term);
// for(int i = 0; i < 6; i++)
// {
// variableName.push_back('x'+to_string(i));
// }
// // Fill the polynomial array.
// polynomialArray.emplace_back("x0+x1+x2+x3+x4+x5");
// polynomialArray.emplace_back("x0*x1+x1*x2+x2*x3+x3*x4+x0*x5+x4*x5");
// polynomialArray.emplace_back("x0*x1*x2+x1*x2*x3+x2*x3*x4+x0*x1*x5+x0*x4*x5+x3*x4*x5");
// polynomialArray.emplace_back("x0*x1*x2*x3+x1*x2*x3*x4+x0*x1*x2*x5+x0*x1*x4*x5+x0*x3*x4*x5+x2*x3*x4*x5");
// polynomialArray.emplace_back("x0*x1*x2*x3*x4+x0*x1*x2*x3*x5+x0*x1*x2*x4*x5+x0*x1*x3*x4*x5+x0*x2*x3*x4*x5+x1*x2*x3*x4*x5");
// polynomialArray.emplace_back("x0*x1*x2*x3*x4*x5-1");
// Compute a reduce groebner basis.
//vector<string> basis = groebnerBasisF4(7, variableName.size(), variableName, polynomialArray, 1, 0);
// for(size_t i = 0; i < basis.size(); i++)
// {
// cout << basis[i] << endl;
// }
// for(int i=1; i<=t; i++) {
// printf("(declare-fun %s () Bool)\n", pvar(i).c_str());
// }
// for (int i = 1; i <= S->maxvar; i++) {
// circuit *c = &(S->C[i]);
// if (!c->sz || S->del[i] == 2) continue;
// int var = i * (S->C[i].neg ? -1 : 1);
// if(c->type == And) {
// string clause = "(assert (= " + pvar(var) + " (and";
// for(int i=0; i<c->sz; i++) {
// clause += " " + pvar(c->to[i]);
// }
// clause += ")))";
// cout << clause << endl;
// }
// if(c->type == Xor) {
// string clause = "(assert (= " + pvar(var) + " (xor";
// for(int i=0; i<c->sz; i++) {
// clause += " " + pvar(c->to[i]);
// }
// clause += ")))";
// cout << clause << endl;
// }
// if (c->type == HA || c->type == FA) {
// string clause = "(assert (= (+ " + pvar(var) + " (* 2 "+pvar(c->carrier)+")) (+ ";
// for(int i=0; i<c->sz; i++) {
// clause += " " + pvar(c->to[i]);
// }
// clause += ")))";
// cout << clause << endl;
// }
// if(c->type == Majority) {
// string ta = pvar(c->to[0]);
// string tb = pvar(c->to[1]);
// string tc = pvar(c->to[2]);
// string clause = "(assert (= "+pvar(var)+" (or (and "+ta+" "+tb+") (and "+ta+" "+tc+") (and "+tb+" "+tc+"))))";
// cout << clause << endl;
// }
// // if (c->type == HA || c->type == FA) {
// // printf("( %d %d )", i * (S->C[i].neg ? -1 : 1), c->carrier);
// // }
// // else {
// // printf("%d", i * (S->C[i].neg ? -1 : 1));
// // }
// // printf(" = %s ( ", gate_type[c->type].c_str());
// // for (int j = 0; j < c->sz; j++) {
// // printf("%d ", c->to[j]);
// // }
// // puts(")");
// }
// printf("(assert (= false %s))\n", pvar(S->maxvar).c_str());
// printf("(check-sat)\n");
//printf("(get-model)\n");
}

View File

@ -26,9 +26,11 @@ class Polynomial {
Monomial ** mon; // /< sorted deque of monomials
public:
size_t num_mon = 0;
public:
/** Constructor */
Polynomial();

File diff suppressed because one or more lines are too long

340
test.v
View File

@ -1,132 +1,218 @@
module top( x0 , x1 , x2 , x3 , x4 , x5 , x6 , x7 , x8 , x9 , x10 , x11 , x12 , x13 , y0 );
input x0 , x1 , x2 , x3 , x4 , x5 , x6 , x7 , x8 , x9 , x10 , x11 , x12 , x13 ;
output y0 ;
wire n15 , n16 , n17 , n18 , n19 , n20 , n21 , n22 , n23 , n24 , n25 , n26 , n27 , n28 , n29 , n30 , n31 , n32 , n33 , n34 , n35 , n36 , n37 , n38 , n39 , n40 , n41 , n42 , n43 , n44 , n45 , n46 , n47 , n48 , n49 , n50 , n51 , n52 , n53 , n54 , n55 , n56 , n57 , n58 , n59 , n60 , n61 , n62 , n63 , n64 , n65 , n66 , n67 , n68 , n69 , n70 , n71 , n72 , n73 , n74 , n75 , n76 , n77 , n78 , n79 , n80 , n81 , n82 , n83 , n84 , n85 , n86 , n87 , n88 , n89 , n90 , n91 , n92 , n93 , n94 , n95 , n96 , n97 , n98 , n99 , n100 , n101 , n102 , n103 , n104 , n105 , n106 , n107 , n108 , n109 , n110 , n111 , n112 , n113 , n114 , n115 , n116 , n117 , n118 , n119 , n120 , n121 , n122 , n123 , n124 , n125 , n126 , n127 , n128 , n129 , n130 , n131 , n132 , n133 , n134 , n135 , n136 , n137 , n138 , n139 , n140 ;
assign n39 = x5 & x11 ;
assign n38 = x1 & x6 ;
assign n40 = n39 ^ n38 ^ 1'b0 ;
assign n60 = x11 & x13 ;
assign n61 = n38 & n60 ;
assign n68 = x0 & x10 ;
assign n59 = x9 & x13 ;
assign n121 = n68 ^ n59 ^ 1'b0 ;
assign n69 = x3 & x4 ;
assign n122 = n121 ^ n69 ^ 1'b0 ;
assign n123 = ( n40 & n61 ) | ( n40 & n122 ) | ( n61 & n122 ) ;
assign n35 = x6 & x11 ;
assign n36 = x1 & x5 ;
assign n37 = n35 & n36 ;
assign n19 = x5 & x6 ;
assign n18 = x8 & x11 ;
assign n21 = n19 ^ n18 ^ 1'b0 ;
assign n108 = n37 ^ n21 ^ 1'b0 ;
assign n44 = x0 & x3 ;
assign n109 = n108 ^ n44 ^ 1'b0 ;
assign n45 = x2 & x10 ;
wire n15 , n16 , n17 , n18 , n19 , n20 , n21 , n22 , n23 , n24 , n25 , n26 , n27 , n28 , n29 , n30 , n31 , n32 , n33 , n34 , n35 , n36 , n37 , n38 , n39 , n40 , n41 , n42 , n43 , n44 , n45 , n46 , n47 , n48 , n49 , n50 , n51 , n52 , n53 , n54 , n55 , n56 , n57 , n58 , n59 , n60 , n61 , n62 , n63 , n64 , n65 , n66 , n67 , n68 , n69 , n70 , n71 , n72 , n73 , n74 , n75 , n76 , n77 , n78 , n79 , n80 , n81 , n82 , n83 , n84 , n85 , n86 , n87 , n88 , n89 , n90 , n91 , n92 , n93 , n94 , n95 , n96 , n97 , n98 , n99 , n100 , n101 , n102 , n103 , n104 , n105 , n106 , n107 , n108 , n109 , n110 , n111 , n112 , n113 , n114 , n115 , n116 , n117 , n118 , n119 , n120 , n121 , n122 , n123 , n124 , n125 , n126 , n127 , n128 , n129 , n130 , n131 , n132 , n133 , n134 , n135 , n136 , n137 , n138 , n139 , n140 , n141 , n142 , n143 , n144 , n145 , n146 , n147 , n148 , n149 , n150 , n151 , n152 , n153 , n154 , n155 , n156 , n157 , n158 , n159 , n160 , n161 , n162 , n163 , n164 , n165 , n166 , n167 , n168 , n169 , n170 , n171 , n172 , n173 , n174 , n175 , n176 , n177 , n178 , n179 , n180 , n181 , n182 , n183 , n184 , n185 , n186 , n187 , n188 , n189 , n190 , n191 , n192 , n193 , n194 , n195 , n196 , n197 , n198 , n199 , n200 , n201 , n202 , n203 , n204 , n205 , n206 , n207 , n208 , n209 , n210 , n211 , n212 , n213 , n214 , n215 , n216 , n217 , n218 , n219 , n220 , n221 , n222 , n223 , n224 , n225 , n226 ;
assign n47 = x3 & x9 ;
assign n45 = x2 & x5 ;
assign n61 = n47 ^ n45 ^ 1'b0 ;
assign n52 = x8 & x11 ;
assign n53 = x4 & x7 ;
assign n54 = n52 & n53 ;
assign n190 = n61 ^ n54 ^ 1'b0 ;
assign n56 = x7 & x11 ;
assign n55 = x4 & x8 ;
assign n57 = n56 ^ n55 ^ 1'b0 ;
assign n75 = x3 & x6 ;
assign n82 = x2 & x4 ;
assign n83 = n52 & n82 ;
assign n191 = ( n57 & n75 ) | ( n57 & n83 ) | ( n75 & n83 ) ;
assign n51 = x4 & x12 ;
assign n46 = x1 & x6 ;
assign n167 = n51 ^ n46 ^ 1'b0 ;
assign n73 = x0 & x10 ;
assign n168 = n167 ^ n73 ^ 1'b0 ;
assign n74 = x5 & x9 ;
assign n76 = x1 & x10 ;
assign n81 = x2 & x12 ;
assign n166 = ( n74 & n76 ) | ( n74 & n81 ) | ( n76 & n81 ) ;
assign n192 = n168 ^ n166 ^ 1'b0 ;
assign n27 = x11 & x13 ;
assign n16 = x7 & x8 ;
assign n29 = n27 ^ n16 ^ 1'b0 ;
assign n193 = n192 ^ n29 ^ 1'b0 ;
assign n194 = ( n190 & n191 ) | ( n190 & n193 ) | ( n191 & n193 ) ;
assign n173 = ( n45 & n47 ) | ( n45 & n54 ) | ( n47 & n54 ) ;
assign n44 = x0 & x6 ;
assign n33 = x2 & x3 ;
assign n171 = n44 ^ n33 ^ 1'b0 ;
assign n35 = x4 & x5 ;
assign n172 = n171 ^ n35 ^ 1'b0 ;
assign n174 = n173 ^ n172 ^ 1'b0 ;
assign n170 = ( n46 & n51 ) | ( n46 & n73 ) | ( n51 & n73 ) ;
assign n175 = n174 ^ n170 ^ 1'b0 ;
assign n169 = ( n29 & n166 ) | ( n29 & n168 ) | ( n166 & n168 ) ;
assign n195 = n175 ^ n169 ^ 1'b0 ;
assign n28 = n16 & n27 ;
assign n25 = x8 & x13 ;
assign n24 = x7 & x12 ;
assign n26 = n25 ^ n24 ^ 1'b0 ;
assign n164 = n28 ^ n26 ^ 1'b0 ;
assign n34 = x1 & x9 ;
assign n106 = n45 ^ n34 ^ 1'b0 ;
assign n46 = x4 & x13 ;
assign n107 = n106 ^ n46 ^ 1'b0 ;
assign n124 = n109 ^ n107 ^ 1'b0 ;
assign n105 = ( n59 & n68 ) | ( n59 & n69 ) | ( n68 & n69 ) ;
assign n125 = n124 ^ n105 ^ 1'b0 ;
assign n73 = x4 & x10 ;
assign n82 = x3 & x9 ;
assign n84 = x3 & x6 ;
assign n126 = x9 & x10 ;
assign n127 = n84 & n126 ;
assign n128 = ( n73 & n82 ) | ( n73 & n127 ) | ( n82 & n127 ) ;
assign n129 = n122 ^ n61 ^ 1'b0 ;
assign n130 = n129 ^ n40 ^ 1'b0 ;
assign n63 = x6 & x13 ;
assign n62 = x1 & x11 ;
assign n64 = n63 ^ n62 ^ 1'b0 ;
assign n94 = x10 & x11 ;
assign n95 = n84 & n94 ;
assign n132 = n126 ^ n84 ^ 1'b0 ;
assign n133 = ( n60 & n95 ) | ( n60 & n132 ) | ( n95 & n132 ) ;
assign n131 = n82 ^ n73 ^ 1'b0 ;
assign n134 = n131 ^ n127 ^ 1'b0 ;
assign n135 = ( n64 & n133 ) | ( n64 & n134 ) | ( n133 & n134 ) ;
assign n136 = ( n128 & n130 ) | ( n128 & n135 ) | ( n130 & n135 ) ;
assign n137 = ( n123 & n125 ) | ( n123 & n136 ) | ( n125 & n136 ) ;
assign n119 = ( n105 & n107 ) | ( n105 & n109 ) | ( n107 & n109 ) ;
assign n53 = x7 & x10 ;
assign n25 = x5 & x9 ;
assign n113 = n53 ^ n25 ^ 1'b0 ;
assign n111 = ( n34 & n45 ) | ( n34 & n46 ) | ( n45 & n46 ) ;
assign n16 = x6 & x8 ;
assign n15 = x11 & x12 ;
assign n17 = n16 ^ n15 ^ 1'b0 ;
assign n112 = n111 ^ n17 ^ 1'b0 ;
assign n114 = n113 ^ n112 ^ 1'b0 ;
assign n31 = x2 & x3 ;
assign n115 = n114 ^ n31 ^ 1'b0 ;
assign n20 = n18 & n19 ;
assign n117 = n115 ^ n20 ^ 1'b0 ;
assign n110 = ( n21 & n37 ) | ( n21 & n44 ) | ( n37 & n44 ) ;
assign n29 = x1 & x4 ;
assign n28 = x0 & x13 ;
assign n30 = n29 ^ n28 ^ 1'b0 ;
assign n116 = n110 ^ n30 ^ 1'b0 ;
assign n118 = n117 ^ n116 ^ 1'b0 ;
assign n120 = n119 ^ n118 ^ 1'b0 ;
assign n138 = n137 ^ n120 ^ 1'b0 ;
assign n83 = n82 ^ n64 ^ 1'b0 ;
assign n85 = n60 & n84 ;
assign n87 = x10 | n85 ;
assign n86 = n84 ^ n60 ^ 1'b0 ;
assign n88 = ( x9 & ~x10 ) | ( x9 & n86 ) | ( ~x10 & n86 ) ;
assign n89 = ( n85 & n87 ) | ( n85 & n88 ) | ( n87 & n88 ) ;
assign n90 = ( n73 & n83 ) | ( n73 & n89 ) | ( n83 & n89 ) ;
assign n70 = n69 ^ n68 ^ 1'b0 ;
assign n80 = n70 ^ n59 ^ 1'b0 ;
assign n65 = x9 | n61 ;
assign n66 = ( x3 & ~x9 ) | ( x3 & n64 ) | ( ~x9 & n64 ) ;
assign n67 = ( n61 & n65 ) | ( n61 & n66 ) | ( n65 & n66 ) ;
assign n79 = n67 ^ n40 ^ 1'b0 ;
assign n81 = n80 ^ n79 ^ 1'b0 ;
assign n102 = n90 ^ n81 ^ 1'b0 ;
assign n74 = n44 & n73 ;
assign n71 = n59 ^ n40 ^ 1'b0 ;
assign n72 = ( n67 & n70 ) | ( n67 & n71 ) | ( n70 & n71 ) ;
assign n77 = n74 ^ n72 ^ 1'b0 ;
assign n47 = n45 ^ n44 ^ 1'b0 ;
assign n48 = n47 ^ n46 ^ 1'b0 ;
assign n57 = n48 ^ n34 ^ 1'b0 ;
assign n41 = x13 | n37 ;
assign n42 = ( x9 & ~x13 ) | ( x9 & n40 ) | ( ~x13 & n40 ) ;
assign n43 = ( n37 & n41 ) | ( n37 & n42 ) | ( n41 & n42 ) ;
assign n56 = n43 ^ n21 ^ 1'b0 ;
assign n58 = n57 ^ n56 ^ 1'b0 ;
assign n78 = n77 ^ n58 ^ 1'b0 ;
assign n96 = ( x9 & x10 ) | ( x9 & ~n95 ) | ( x10 & ~n95 ) ;
assign n97 = n96 ^ n86 ^ 1'b0 ;
assign n98 = n95 & n97 ;
assign n99 = n89 ^ n73 ^ 1'b0 ;
assign n100 = n99 ^ n83 ^ 1'b0 ;
assign n101 = n98 & n100 ;
assign n103 = n78 & n101 ;
assign n104 = n102 & n103 ;
assign n139 = n138 ^ n104 ^ 1'b0 ;
assign n91 = ( ~n78 & n81 ) | ( ~n78 & n90 ) | ( n81 & n90 ) ;
assign n92 = n78 & n91 ;
assign n75 = ( n58 & n72 ) | ( n58 & n74 ) | ( n72 & n74 ) ;
assign n52 = ( n44 & n45 ) | ( n44 & n46 ) | ( n45 & n46 ) ;
assign n49 = n34 ^ n21 ^ 1'b0 ;
assign n50 = ( n43 & n48 ) | ( n43 & n49 ) | ( n48 & n49 ) ;
assign n22 = x9 | n20 ;
assign n23 = ( x1 & ~x9 ) | ( x1 & n21 ) | ( ~x9 & n21 ) ;
assign n24 = ( n20 & n22 ) | ( n20 & n23 ) | ( n22 & n23 ) ;
assign n26 = n24 ^ n17 ^ 1'b0 ;
assign n27 = n26 ^ n25 ^ 1'b0 ;
assign n32 = n30 ^ n27 ^ 1'b0 ;
assign n33 = n32 ^ n31 ^ 1'b0 ;
assign n51 = n50 ^ n33 ^ 1'b0 ;
assign n54 = n52 ^ n51 ^ 1'b0 ;
assign n55 = n54 ^ n53 ^ 1'b0 ;
assign n76 = n75 ^ n55 ^ 1'b0 ;
assign n93 = n92 ^ n76 ^ 1'b0 ;
assign n140 = n139 ^ n93 ^ 1'b0 ;
assign y0 = n140 ;
assign n165 = n164 ^ n34 ^ 1'b0 ;
assign n196 = n195 ^ n165 ^ 1'b0 ;
assign n106 = x9 & x12 ;
assign n115 = x3 & x10 ;
assign n116 = x5 & x6 ;
assign n197 = ( n106 & n115 ) | ( n106 & n116 ) | ( n115 & n116 ) ;
assign n198 = n81 ^ n76 ^ 1'b0 ;
assign n199 = n198 ^ n74 ^ 1'b0 ;
assign n200 = n83 ^ n57 ^ 1'b0 ;
assign n201 = n200 ^ n75 ^ 1'b0 ;
assign n202 = ( n197 & n199 ) | ( n197 & n201 ) | ( n199 & n201 ) ;
assign n203 = n193 ^ n191 ^ 1'b0 ;
assign n204 = n203 ^ n190 ^ 1'b0 ;
assign n85 = x4 & x11 ;
assign n84 = x2 & x8 ;
assign n86 = n85 ^ n84 ^ 1'b0 ;
assign n107 = x9 & x11 ;
assign n108 = n84 & n107 ;
assign n205 = n115 ^ n106 ^ 1'b0 ;
assign n206 = n205 ^ n116 ^ 1'b0 ;
assign n207 = ( n86 & n108 ) | ( n86 & n206 ) | ( n108 & n206 ) ;
assign n208 = n201 ^ n199 ^ 1'b0 ;
assign n209 = n208 ^ n197 ^ 1'b0 ;
assign n135 = x6 & x12 ;
assign n143 = x5 & x10 ;
assign n137 = x6 & x8 ;
assign n210 = x10 & x12 ;
assign n211 = n137 & n210 ;
assign n212 = ( n135 & n143 ) | ( n135 & n211 ) | ( n143 & n211 ) ;
assign n213 = n206 ^ n108 ^ 1'b0 ;
assign n214 = n213 ^ n86 ^ 1'b0 ;
assign n110 = x8 & x9 ;
assign n109 = x2 & x11 ;
assign n111 = n110 ^ n109 ^ 1'b0 ;
assign n150 = x10 & x11 ;
assign n151 = n137 & n150 ;
assign n216 = n210 ^ n137 ^ 1'b0 ;
assign n217 = ( n107 & n151 ) | ( n107 & n216 ) | ( n151 & n216 ) ;
assign n215 = n143 ^ n135 ^ 1'b0 ;
assign n218 = n215 ^ n211 ^ 1'b0 ;
assign n219 = ( n111 & n217 ) | ( n111 & n218 ) | ( n217 & n218 ) ;
assign n220 = ( n212 & n214 ) | ( n212 & n219 ) | ( n214 & n219 ) ;
assign n221 = ( n207 & n209 ) | ( n207 & n220 ) | ( n209 & n220 ) ;
assign n222 = ( n202 & n204 ) | ( n202 & n221 ) | ( n204 & n221 ) ;
assign n223 = ( n194 & n196 ) | ( n194 & n222 ) | ( n196 & n222 ) ;
assign n188 = ( n165 & n169 ) | ( n165 & n175 ) | ( n169 & n175 ) ;
assign n21 = x1 & x2 ;
assign n19 = x3 & x4 ;
assign n184 = n21 ^ n19 ^ 1'b0 ;
assign n15 = x12 & x13 ;
assign n176 = n15 & n16 ;
assign n186 = n184 ^ n176 ^ 1'b0 ;
assign n41 = x0 & x9 ;
assign n181 = n41 ^ n15 ^ 1'b0 ;
assign n180 = ( n33 & n35 ) | ( n33 & n44 ) | ( n35 & n44 ) ;
assign n182 = n181 ^ n180 ^ 1'b0 ;
assign n18 = x5 & x7 ;
assign n183 = n182 ^ n18 ^ 1'b0 ;
assign n178 = ( n26 & n28 ) | ( n26 & n34 ) | ( n28 & n34 ) ;
assign n177 = ( n170 & n172 ) | ( n170 & n173 ) | ( n172 & n173 ) ;
assign n179 = n178 ^ n177 ^ 1'b0 ;
assign n185 = n183 ^ n179 ^ 1'b0 ;
assign n187 = n186 ^ n185 ^ 1'b0 ;
assign n189 = n188 ^ n187 ^ 1'b0 ;
assign n224 = n223 ^ n189 ^ 1'b0 ;
assign n136 = n135 ^ n111 ^ 1'b0 ;
assign n138 = n107 & n137 ;
assign n140 = x12 | n138 ;
assign n139 = n137 ^ n107 ^ 1'b0 ;
assign n141 = ( x10 & ~x12 ) | ( x10 & n139 ) | ( ~x12 & n139 ) ;
assign n142 = ( n138 & n140 ) | ( n138 & n141 ) | ( n140 & n141 ) ;
assign n144 = ( n136 & n142 ) | ( n136 & n143 ) | ( n142 & n143 ) ;
assign n120 = x6 & x10 ;
assign n121 = x3 & x5 ;
assign n122 = n120 & n121 ;
assign n112 = x12 | n108 ;
assign n113 = ( x6 & ~x12 ) | ( x6 & n111 ) | ( ~x12 & n111 ) ;
assign n114 = ( n108 & n112 ) | ( n108 & n113 ) | ( n112 & n113 ) ;
assign n117 = n116 ^ n115 ^ 1'b0 ;
assign n118 = n106 ^ n86 ^ 1'b0 ;
assign n119 = ( n114 & n117 ) | ( n114 & n118 ) | ( n117 & n118 ) ;
assign n130 = n122 ^ n119 ^ 1'b0 ;
assign n90 = n76 ^ n75 ^ 1'b0 ;
assign n91 = n90 ^ n74 ^ 1'b0 ;
assign n104 = n91 ^ n81 ^ 1'b0 ;
assign n87 = x12 | n83 ;
assign n88 = ( x9 & ~x12 ) | ( x9 & n86 ) | ( ~x12 & n86 ) ;
assign n89 = ( n83 & n87 ) | ( n83 & n88 ) | ( n87 & n88 ) ;
assign n103 = n89 ^ n57 ^ 1'b0 ;
assign n105 = n104 ^ n103 ^ 1'b0 ;
assign n131 = n130 ^ n105 ^ 1'b0 ;
assign n133 = n117 ^ n106 ^ 1'b0 ;
assign n132 = n114 ^ n86 ^ 1'b0 ;
assign n134 = n133 ^ n132 ^ 1'b0 ;
assign n145 = n131 & n134 ;
assign n146 = n144 & n145 ;
assign n123 = ( n105 & n119 ) | ( n105 & n122 ) | ( n119 & n122 ) ;
assign n62 = n61 ^ n46 ^ 1'b0 ;
assign n79 = n62 ^ n51 ^ 1'b0 ;
assign n58 = x12 | n54 ;
assign n59 = ( x2 & ~x12 ) | ( x2 & n57 ) | ( ~x12 & n57 ) ;
assign n60 = ( n54 & n58 ) | ( n54 & n59 ) | ( n58 & n59 ) ;
assign n78 = n60 ^ n29 ^ 1'b0 ;
assign n80 = n79 ^ n78 ^ 1'b0 ;
assign n77 = ( n74 & n75 ) | ( n74 & n76 ) | ( n75 & n76 ) ;
assign n101 = n80 ^ n77 ^ 1'b0 ;
assign n92 = n81 ^ n57 ^ 1'b0 ;
assign n93 = ( n89 & n91 ) | ( n89 & n92 ) | ( n91 & n92 ) ;
assign n100 = n93 ^ n73 ^ 1'b0 ;
assign n102 = n101 ^ n100 ^ 1'b0 ;
assign n129 = n123 ^ n102 ^ 1'b0 ;
assign n161 = n146 ^ n129 ^ 1'b0 ;
assign n124 = n102 & n123 ;
assign n94 = n77 ^ n73 ^ 1'b0 ;
assign n95 = ( n80 & n93 ) | ( n80 & n94 ) | ( n93 & n94 ) ;
assign n36 = n34 ^ n33 ^ 1'b0 ;
assign n37 = n36 ^ n35 ^ 1'b0 ;
assign n30 = x12 | n28 ;
assign n31 = ( x4 & ~x12 ) | ( x4 & n29 ) | ( ~x12 & n29 ) ;
assign n32 = ( n28 & n30 ) | ( n28 & n31 ) | ( n30 & n31 ) ;
assign n49 = n37 ^ n32 ^ 1'b0 ;
assign n50 = n49 ^ n26 ^ 1'b0 ;
assign n48 = ( n45 & n46 ) | ( n45 & n47 ) | ( n46 & n47 ) ;
assign n71 = n50 ^ n48 ^ 1'b0 ;
assign n63 = n51 ^ n29 ^ 1'b0 ;
assign n64 = ( n60 & n62 ) | ( n60 & n63 ) | ( n62 & n63 ) ;
assign n70 = n64 ^ n44 ^ 1'b0 ;
assign n72 = n71 ^ n70 ^ 1'b0 ;
assign n98 = n95 ^ n72 ^ 1'b0 ;
assign n96 = n73 & n77 ;
assign n99 = n98 ^ n96 ^ 1'b0 ;
assign n128 = n124 ^ n99 ^ 1'b0 ;
assign n158 = n144 ^ n134 ^ 1'b0 ;
assign n152 = ( x10 & x12 ) | ( x10 & ~n151 ) | ( x12 & ~n151 ) ;
assign n153 = n152 ^ n139 ^ 1'b0 ;
assign n154 = n151 & n153 ;
assign n155 = n143 ^ n142 ^ 1'b0 ;
assign n156 = n155 ^ n136 ^ 1'b0 ;
assign n157 = n154 & n156 ;
assign n159 = n131 & n157 ;
assign n160 = n158 & n159 ;
assign n162 = n128 & n160 ;
assign n163 = n161 & n162 ;
assign n225 = n224 ^ n163 ^ 1'b0 ;
assign n147 = ( ~n128 & n129 ) | ( ~n128 & n146 ) | ( n129 & n146 ) ;
assign n148 = n128 & n147 ;
assign n97 = ( n72 & n95 ) | ( n72 & n96 ) | ( n95 & n96 ) ;
assign n65 = n48 ^ n44 ^ 1'b0 ;
assign n66 = ( n50 & n64 ) | ( n50 & n65 ) | ( n64 & n65 ) ;
assign n40 = ( n33 & n34 ) | ( n33 & n35 ) | ( n34 & n35 ) ;
assign n38 = ( n26 & n32 ) | ( n26 & n37 ) | ( n32 & n37 ) ;
assign n20 = n19 ^ n18 ^ 1'b0 ;
assign n17 = n15 & ~n16 ;
assign n22 = n20 ^ n17 ^ 1'b0 ;
assign n23 = n22 ^ n21 ^ 1'b0 ;
assign n39 = n38 ^ n23 ^ 1'b0 ;
assign n42 = n40 ^ n39 ^ 1'b0 ;
assign n43 = n42 ^ n41 ^ 1'b0 ;
assign n68 = n66 ^ n43 ^ 1'b0 ;
assign n67 = n44 & n48 ;
assign n69 = n68 ^ n67 ^ 1'b0 ;
assign n126 = n97 ^ n69 ^ 1'b0 ;
assign n125 = n99 & n124 ;
assign n127 = n126 ^ n125 ^ 1'b0 ;
assign n149 = n148 ^ n127 ^ 1'b0 ;
assign n226 = n225 ^ n149 ^ 1'b0 ;
assign y0 = n226 ;
endmodule