-- Copyright © 1993 by McGraw-Hill, Inc. and Zainalabedin Navabi
-- FIGURE 9.12
-- BODY OF PAR_UTILITIES PACKAGE OF PAR_LIBRARY :
PACKAGE body par_utilities IS
FUNCTION "XOR" (a, b : qit) RETURN qit IS
CONSTANT qit_or_table : qit_2d := (
('0','1','1','X'),
('1','0','0','X'),
('1','0','0','X'),
('X','X','X','X'));
BEGIN
RETURN qit_or_table (a, b);
END "XOR";
FUNCTION "AND" (a,b : qit_vector) RETURN qit_vector IS
VARIABLE r : qit_vector (a'RANGE);
BEGIN
loop1: FOR i IN a'RANGE LOOP
r(i) := a(i) AND b(i);
END LOOP loop1;
RETURN r;
END "AND";
--
FUNCTION "OR" (a,b: qit_vector) RETURN qit_vector IS
VARIABLE r: qit_vector (a'RANGE);
BEGIN
loop1: FOR i IN a'RANGE LOOP
r(i) := a(i) OR b(i);
END LOOP loop1;
RETURN r;
END "OR";
--
FUNCTION "NOT" (a: qit_vector) RETURN qit_vector IS
VARIABLE r: qit_vector (a'RANGE);
BEGIN
loop1: FOR i IN a'RANGE LOOP
r(i) := NOT a(i);
END LOOP loop1;
RETURN r;
END "NOT";
--
FUNCTION add_cv (a, b : qit_vector; cin : qit) RETURN qit_vector IS
--left bits are sign bit
VARIABLE r, c: qit_vector (a'LEFT + 2 DOWNTO 0);
-- two extra bits in r are: msb for overflow, next carry
VARIABLE a_sign, b_sign: qit;
BEGIN
a_sign := a(a'LEFT);
b_sign := b(b'LEFT);
r(0) := a(0) XOR b(0) XOR cin;
c(0) := ((a(0) XOR b(0)) AND cin) OR (a(0) AND b(0));
FOR i IN 1 TO (a'LEFT) LOOP
r(i) := a(i) XOR b(i) XOR c(i-1);
c(i) := ((a(i) XOR b(i)) AND c(i-1)) OR (a(i) AND b(i));
END LOOP;
r(a'LEFT+1) := c(a'LEFT);
IF a_sign = b_sign AND r(a'LEFT) /= a_sign
THEN r(a'LEFT+2) := '1'; --overflow
ELSE r(a'LEFT+2) := '0'; END IF;
RETURN r;
END add_cv;
FUNCTION sub_cv (a, b : qit_vector; cin : qit) RETURN qit_vector IS
VARIABLE not_b : qit_vector (b'LEFT DOWNTO 0);
VARIABLE not_c : qit;
VARIABLE r : qit_vector (a'LEFT + 2 DOWNTO 0);
BEGIN
not_b := NOT b;
not_c := NOT cin;
r := add_cv (a, not_b, not_c);
RETURN r;
END sub_cv;
FUNCTION set_if_zero (a : qit_vector) RETURN qit IS
VARIABLE zero : qit := '1';
BEGIN
FOR i IN a'RANGE LOOP
IF a(i) /= '0'
THEN zero := '0'; EXIT;
END IF;
END LOOP;
RETURN zero;
END set_if_zero;
END par_utilities;
--