Mux2Constant: PROC [b: NAT, v: INT, inverting: BOOL] RETURNS [ct: Core.CellType] ~ {
Not correct yet...
Returns a multiplexer with a constant
Public => Input[b], Output[b], Force (when TRUE, select the constant)
Implementation is to AND (resp NAND) 0's in the constant, OR (resp NOR) 1's in the constant
vCard: CARD = LOOPHOLE[v];
one: Core.CellType = IF inverting THEN Logic.Nand[2] ELSE Logic.And[2];
zero: Core.CellType = IF inverting THEN Logic.Nor[2] ELSE Logic.Or[2];
instances: CoreCreate.CellInstances ← NIL;
input: Core.Wire ← CoreCreate.Seq["Input", b];
output: Core.Wire ← CoreCreate.Seq["Output", b];
IF b=0 THEN LogicUtils.Error["Please specify a number of bits for the constant comparator"];
FOR i: NAT IN [0..b) DO
instances ← CONS [
CoreCreate.Instance[
IF BitOps.EBFD[vCard, i, b] THEN one ELSE zero,
["I[0]", "nnForce"], ["I[1]", input[i]], ["X", output[i]]],
instances]
ENDLOOP;
instances ← CONS [CoreCreate.Instance[Logic.Buffer[2], ["I", "Force"], ["X", "nForce"]], instances];
instances ← CONS [CoreCreate.Instance[Logic.Buffer[Real.Round[Real.SqRt[b/2]]], ["I", "nForce"], ["X", "nnForce"]], instances];
ct ← CoreCreate.Cell[name: "Mux2Constant",
public: Wires[input, output, "Force"],
onlyInternal: Wires["nForce", "nnForce"],
instances: instances];
};