Half-adder, full-adder, and tests

This commit is contained in:
David Greenspan
2014-12-27 20:32:41 -08:00
parent 50fda15c99
commit bf218213f4
2 changed files with 126 additions and 0 deletions

View File

@@ -854,3 +854,64 @@ Logic._defineFormula(Logic.EqualBitsFormula, 'equalBits', {
return t.generate(isTrue, Logic.and(facts));
}
});
Logic.HalfAdderSum = function (formula1, formula2) {
check(formula1, Logic.FormulaOrTerm);
check(formula2, Logic.FormulaOrTerm);
check(arguments.length, 2);
this.a = formula1;
this.b = formula2;
};
Logic._defineFormula(Logic.HalfAdderSum, 'hsum', {
generateClauses: function (isTrue, t) {
return t.generate(isTrue, Logic.xor(this.a, this.b));
}
});
Logic.HalfAdderCarry = function (formula1, formula2) {
check(formula1, Logic.FormulaOrTerm);
check(formula2, Logic.FormulaOrTerm);
check(arguments.length, 2);
this.a = formula1;
this.b = formula2;
};
Logic._defineFormula(Logic.HalfAdderCarry, 'hcarry', {
generateClauses: function (isTrue, t) {
return t.generate(isTrue, Logic.and(this.a, this.b));
}
});
Logic.FullAdderSum = function (formula1, formula2, formula3) {
check(formula1, Logic.FormulaOrTerm);
check(formula2, Logic.FormulaOrTerm);
check(formula3, Logic.FormulaOrTerm);
check(arguments.length, 3);
this.a = formula1;
this.b = formula2;
this.c = formula3;
};
Logic._defineFormula(Logic.FullAdderSum, 'fsum', {
generateClauses: function (isTrue, t) {
return t.generate(isTrue, Logic.xor(this.a, this.b, this.c));
}
});
Logic.FullAdderCarry = function (formula1, formula2, formula3) {
check(formula1, Logic.FormulaOrTerm);
check(formula2, Logic.FormulaOrTerm);
check(formula3, Logic.FormulaOrTerm);
check(arguments.length, 3);
this.a = formula1;
this.b = formula2;
this.c = formula3;
};
Logic._defineFormula(Logic.FullAdderCarry, 'fcarry', {
generateClauses: function (isTrue, t) {
return t.generate(! isTrue,
Logic.atMostOne(this.a, this.b, this.c));
}
});

View File

@@ -934,3 +934,68 @@ Tinytest.add("logic-solver - Logic.lessThan[OrEqual]", function (test) {
"$xor3 v $xor2 v $xor1"]
]);
});
Tinytest.add("logic-solver - half/full sum/carry", function (test) {
runClauseTests(test, [
function (s) {
s.require(new Logic.HalfAdderSum("A", "B")); },
["A v B", "-A v -B"],
function (s) {
s.forbid(new Logic.HalfAdderSum("A", "B")); },
["A v -B", "-A v B"],
function (s) {
s.require(Logic.or(new Logic.HalfAdderSum("A", "B"), "C")); },
["A v B v -$hsum1",
"-A v -B v -$hsum1",
"$hsum1 v C"],
function (s) {
s.require(new Logic.HalfAdderCarry("A", "B")); },
["A", "B"],
function (s) {
s.forbid(new Logic.HalfAdderCarry("A", "B")); },
["-A v -B"],
function (s) {
s.require(Logic.or(new Logic.HalfAdderCarry("A", "B"), "C")); },
["A v -$hcarry1",
"B v -$hcarry1",
"$hcarry1 v C"]
]);
runClauseTests(test, [
function (s) {
s.require(new Logic.FullAdderSum("A", "B", "C")); },
["A v B v C",
"A v -B v -C",
"-A v B v -C",
"-A v -B v C"],
function (s) {
s.forbid(new Logic.FullAdderSum("A", "B", "C")); },
["-A v -B v -C",
"-A v B v C",
"A v -B v C",
"A v B v -C"],
function (s) {
s.require(Logic.or(new Logic.FullAdderSum("A", "B", "C"), "D")); },
["A v B v C v -$fsum1",
"A v -B v -C v -$fsum1",
"-A v B v -C v -$fsum1",
"-A v -B v C v -$fsum1",
"$fsum1 v D"],
function (s) {
s.require(new Logic.FullAdderCarry("A", "B", "C")); },
["A v B",
"A v C",
"B v C"],
function (s) {
s.forbid(new Logic.FullAdderCarry("A", "B", "C")); },
["-A v -B",
"-A v -C",
"-B v -C"],
function (s) {
s.require(Logic.or(new Logic.FullAdderCarry("A", "B", "C"), "D")); },
["A v B v -$fcarry1",
"A v C v -$fcarry1",
"B v C v -$fcarry1",
"$fcarry1 v D"]
]);
});