Skip to content

Commit

Permalink
Refactoring
Browse files Browse the repository at this point in the history
  • Loading branch information
cjdrake committed May 29, 2015
1 parent 56e0b79 commit 06231f5
Show file tree
Hide file tree
Showing 4 changed files with 89 additions and 61 deletions.
24 changes: 12 additions & 12 deletions extension/boolexpr/argset.c
Original file line number Diff line number Diff line change
Expand Up @@ -57,9 +57,9 @@ BoolExprOrAndArgSet_Insert(struct BoolExprOrAndArgSet *argset, struct BoolExpr *
}
// x | ~x = 1 ; x & ~x = 0
else if (IS_LIT(key) || IS_NOT(key)) {
struct BoolExpr *ex = Not(key);
dominate = BoolExprSet_Contains(argset->xs, ex);
BoolExpr_DecRef(ex);
struct BoolExpr *temp = Not(key);
dominate = BoolExprSet_Contains(argset->xs, temp);
BoolExpr_DecRef(temp);
}
if (dominate) {
argset->min = false;
Expand Down Expand Up @@ -131,14 +131,14 @@ BoolExprXorArgSet_Insert(struct BoolExprXorArgSet *argset, struct BoolExpr *key)
/* Xor(x, y, z, ~z) = Xnor(x, y) */
/* Xnor(x, y, z, ~z) = Xor(x, y) */
if (IS_LIT(key) || IS_NOT(key)) {
struct BoolExpr *ex = Not(key);
if (BoolExprSet_Contains(argset->xs, ex)) {
BoolExprSet_Remove(argset->xs, ex);
BoolExpr_DecRef(ex);
struct BoolExpr *temp = Not(key);
bool inset = BoolExprSet_Contains(argset->xs, temp);
BoolExpr_DecRef(temp);
if (inset) {
BoolExprSet_Remove(argset->xs, temp);
argset->parity ^= true;
return true;
}
BoolExpr_DecRef(ex);
}

/* Xor (x, Xor(y, z)) = Xor (x, y, z) */
Expand Down Expand Up @@ -219,15 +219,15 @@ BoolExprEqArgSet_Insert(struct BoolExprEqArgSet *argset, struct BoolExpr *key)

/* Equal(~x, x) = 0 */
if (IS_LIT(key) || IS_NOT(key)) {
struct BoolExpr *ex = Not(key);
if (BoolExprSet_Contains(argset->xs, ex)) {
BoolExpr_DecRef(ex);
struct BoolExpr *temp = Not(key);
bool inset = BoolExprSet_Contains(argset->xs, temp);
BoolExpr_DecRef(temp);
if (inset) {
argset->zero = true;
argset->one = true;
BoolExprSet_Clear(argset->xs);
return true;
}
BoolExpr_DecRef(ex);
}

/* Equal(x, x, y) = Equal(x, y) */
Expand Down
3 changes: 2 additions & 1 deletion extension/boolexpr/array.c
Original file line number Diff line number Diff line change
Expand Up @@ -51,9 +51,10 @@ BoolExprArray_Equal(struct BoolExprArray *self, struct BoolExprArray *other)
if (self->length != other->length)
return false;

for (size_t i = 0; i < self->length; ++i)
for (size_t i = 0; i < self->length; ++i) {
if (self->items[i] != other->items[i])
return false;
}

return true;
}
Expand Down
43 changes: 23 additions & 20 deletions extension/boolexpr/array2.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@


/* boolexpr.c */
struct BoolExpr * _opn_new(BoolExprKind kind, size_t n, ...);
struct BoolExpr * _op_new(BoolExprKind kind, size_t n, struct BoolExpr **xs);


struct BoolExprArray2 *
Expand Down Expand Up @@ -63,9 +63,10 @@ BoolExprArray2_Equal(struct BoolExprArray2 *self, struct BoolExprArray2 *other)
if (self->length != other->length)
return false;

for (size_t i = 0; i < self->length; ++i)
for (size_t i = 0; i < self->length; ++i) {
if (!BoolExprArray_Equal(self->items[i], other->items[i]))
return false;
}

return true;
}
Expand All @@ -82,9 +83,12 @@ _multiply(struct BoolExprArray *a, struct BoolExprArray *b, BoolExprKind kind)
if (items == NULL)
return NULL; // LCOV_EXCL_LINE

for (size_t i = 0, index = 0; i < a->length; ++i)
for (size_t j = 0; j < b->length; ++j, ++index)
CHECK_NULL_N(items[index], _opn_new(kind, 2, a->items[i], b->items[j]), index, items);
for (size_t i = 0, index = 0; i < a->length; ++i) {
for (size_t j = 0; j < b->length; ++j, ++index) {
struct BoolExpr *xs[2] = {a->items[i], b->items[j]};
CHECK_NULL_N(items[index], _op_new(kind, 2, xs), index, items);
}
}

CHECK_NULL_N(prod, BoolExprArray_New(length, items), length, items);

Expand All @@ -103,24 +107,23 @@ _product(struct BoolExprArray2 *array2, BoolExprKind kind, size_t n)
struct BoolExpr *items[] = {IDENTITY[kind]};
return BoolExprArray_New(1, items);
}
else {
struct BoolExprArray *prev;
struct BoolExprArray *prod;

prev = _product(array2, kind, n-1);
if (prev == NULL)
return NULL; // LCOV_EXCL_LINE

prod = _multiply(array2->items[n-1], prev, kind);
if (prod == NULL) {
BoolExprArray_Del(prev); // LCOV_EXCL_LINE
return NULL; // LCOV_EXCL_LINE
}

BoolExprArray_Del(prev);
struct BoolExprArray *prev;
struct BoolExprArray *prod;

prev = _product(array2, kind, n-1);
if (prev == NULL)
return NULL; // LCOV_EXCL_LINE

return prod;
prod = _multiply(array2->items[n-1], prev, kind);
if (prod == NULL) {
BoolExprArray_Del(prev); // LCOV_EXCL_LINE
return NULL; // LCOV_EXCL_LINE
}

BoolExprArray_Del(prev);

return prod;
}


Expand Down
80 changes: 52 additions & 28 deletions extension/boolexpr/boolexpr.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,11 @@
#include "boolexpr.h"


#define READ_ARGS \
#define READ_ARGS(n, xs) \
do { \
va_list vl; \
va_start(vl, n); \
for (int i = 0; i < n; ++i) \
for (size_t i = 0; i < n; ++i) \
xs[i] = va_arg(vl, struct BoolExpr *); \
va_end(vl); \
} while (0)
Expand Down Expand Up @@ -160,15 +160,6 @@ _op_new(BoolExprKind kind, size_t n, struct BoolExpr **xs)
}


struct BoolExpr *
_opn_new(BoolExprKind kind, size_t n, ...)
{
struct BoolExpr *xs[n];
READ_ARGS;
return _op_new(kind, n, xs);
}


struct BoolExpr *
_orandxor_new(BoolExprKind kind, size_t n, struct BoolExpr **xs)
{
Expand Down Expand Up @@ -297,13 +288,42 @@ Unequal(size_t n, struct BoolExpr **xs)
}


static struct BoolExpr * _zero_inv(struct BoolExpr *x) { return BoolExpr_IncRef(&One); }
static struct BoolExpr * _one_inv(struct BoolExpr *x) { return BoolExpr_IncRef(&Zero); }
static struct BoolExpr * _log_inv(struct BoolExpr *x) { return BoolExpr_IncRef(&Logical); }
static struct BoolExpr * _ill_inv(struct BoolExpr *x) { return BoolExpr_IncRef(&Illogical); }
static struct BoolExpr * _not_inv(struct BoolExpr *x) { return BoolExpr_IncRef(x->data.xs->items[0]); }
static struct BoolExpr * _lit_inv(struct BoolExpr *lit) { return Literal(lit->data.lit.lits, -lit->data.lit.uniqid); }
static struct BoolExpr * _op_inv(struct BoolExpr *op) { return _opn_new(OP_NOT, 1, op); }
static struct BoolExpr * _zero_inv(struct BoolExpr *x)
{
return BoolExpr_IncRef(&One);
}

static struct BoolExpr * _one_inv(struct BoolExpr *x)
{
return BoolExpr_IncRef(&Zero);
}

static struct BoolExpr * _log_inv(struct BoolExpr *x)
{
return BoolExpr_IncRef(&Logical);
}

static struct BoolExpr * _ill_inv(struct BoolExpr *x)
{
return BoolExpr_IncRef(&Illogical);
}

static struct BoolExpr * _not_inv(struct BoolExpr *x)
{
return BoolExpr_IncRef(x->data.xs->items[0]);
}

static struct BoolExpr * _lit_inv(struct BoolExpr *lit)
{
return Literal(lit->data.lit.lits, -lit->data.lit.uniqid);
}

static struct BoolExpr * _op_inv(struct BoolExpr *op)
{
struct BoolExpr *xs[1] = {op};

return _op_new(OP_NOT, 1, xs);
}


static struct BoolExpr * (*_boolexpr_inv[16])(struct BoolExpr *ex) = {
Expand Down Expand Up @@ -339,22 +359,26 @@ Not(struct BoolExpr *x)
struct BoolExpr *
Implies(struct BoolExpr *p, struct BoolExpr *q)
{
return _opn_new(OP_IMPL, 2, p, q);
struct BoolExpr *xs[2] = {p, q};

return _op_new(OP_IMPL, 2, xs);
}


struct BoolExpr *
ITE(struct BoolExpr *s, struct BoolExpr *d1, struct BoolExpr *d0)
{
return _opn_new(OP_ITE, 3, s, d1, d0);
struct BoolExpr *xs[3] = {s, d1, d0};

return _op_new(OP_ITE, 3, xs);
}


struct BoolExpr *
OrN(size_t n, ...)
{
struct BoolExpr *xs[n];
READ_ARGS;
READ_ARGS(n, xs);
return Or(n, xs);
}

Expand All @@ -363,7 +387,7 @@ struct BoolExpr *
NorN(size_t n, ...)
{
struct BoolExpr *xs[n];
READ_ARGS;
READ_ARGS(n, xs);
return Nor(n, xs);
}

Expand All @@ -372,7 +396,7 @@ struct BoolExpr *
AndN(size_t n, ...)
{
struct BoolExpr *xs[n];
READ_ARGS;
READ_ARGS(n, xs);
return And(n, xs);
}

Expand All @@ -381,7 +405,7 @@ struct BoolExpr *
NandN(size_t n, ...)
{
struct BoolExpr *xs[n];
READ_ARGS;
READ_ARGS(n, xs);
return Nand(n, xs);
}

Expand All @@ -390,7 +414,7 @@ struct BoolExpr *
XorN(size_t n, ...)
{
struct BoolExpr *xs[n];
READ_ARGS;
READ_ARGS(n, xs);
return Xor(n, xs);
}

Expand All @@ -399,7 +423,7 @@ struct BoolExpr *
XnorN(size_t n, ...)
{
struct BoolExpr *xs[n];
READ_ARGS;
READ_ARGS(n, xs);
return Xnor(n, xs);
}

Expand All @@ -408,7 +432,7 @@ struct BoolExpr *
EqualN(size_t n, ...)
{
struct BoolExpr *xs[n];
READ_ARGS;
READ_ARGS(n, xs);
return Equal(n, xs);
}

Expand All @@ -417,7 +441,7 @@ struct BoolExpr *
UnequalN(size_t n, ...)
{
struct BoolExpr *xs[n];
READ_ARGS;
READ_ARGS(n, xs);
return Unequal(n, xs);
}

Expand Down

0 comments on commit 06231f5

Please sign in to comment.