(defines (sub-width (min (param "inputWidth") (param "outputWidth"))) (output-extend (- (param "outputWidth") sub-width)) ; Is this a pull (#t) or push (#f) operation (pull-op (= component-name "UnaryFunc")) ) (nodes ("nStart" 1 0 1) ("nCv" (+ 1 sub-width) 0 1) ("c" (+ 1 sub-width) 0 1) ("i" sub-width 0 1) ("j" sub-width 0 1) ("start" 1 0 1) ("done" 1 0 1) ) (gates ; control stuff first (if pull-op (gates (connect (req "out") (req "inp")) (connect (ack "inp") (node "start")) (connect (node "done") (ack "out")) ) (gates (connect (req "inp") (node "start")) (connect (node "done") (req "out")) (connect (ack "out") (ack "inp")) ) ) (case (param "op") (("Invert") (connect (node "start") (node "done")) (cond ((<= (param "outputWidth") (param "inputWidth")) (inv (data "out") (slice 0 (param "outputWidth") (data "inp"))) ) ((= "true" (param "inputIsSigned")) (inv (slice 0 (param "inputWidth") (data "out")) (data "inp")) (inv (slice (param "inputWidth") (- (param "outputWidth") (param "inputWidth")) (data "out")) (combine (dup (- (param "outputWidth") (param "inputWidth")) (slice (- (param "inputWidth") 1) 1 (data "inp")))) ) ) (else (inv (slice 0 (param "inputWidth") (data "out")) (data "inp")) (vcc (slice (param "inputWidth") (- (param "outputWidth") (param "inputWidth")) (data "out"))) ) ) ) (("Negate") (inv (node "nStart") (node "start")) (inv (node "i") (slice 0 sub-width (data "inp"))) (if (< 0 output-extend) (connect (slice sub-width 1 (node "c")) (smash (slice sub-width output-extend (data "out")))) ; sign extend result ) (connect (node "nStart") (slice 0 1 (node "nCv"))) (gnd (smash (node "j"))) (vcc (slice 0 1 (node "c"))) (adder (combine (dup sub-width (node "nStart"))) (node "i") (node "j") (slice 0 sub-width (node "nCv")) (slice 0 sub-width (node "c")) (slice 1 sub-width (node "nCv")) (slice 1 sub-width (node "c")) (slice 0 sub-width (data "out")) ) (nor (node "done") (smash (slice 1 sub-width (node "nCv")))) ) ) )