/* ALU16 by Josh Walker - cs355 Spring 1999 */

Define ALU1 A B Cin C1 C0 | S Cout;

Not da C0 NC0;
Not fa C1 NC1;
And db NC1 NC0 on0;
And eb NC1 C0 on1;
And fb C1 NC0 on2;
And gb C1 C0 on3;

And ab A B on1 output1;
And bb A on2 output2;
Not ca A NA;
And cb NA on3 output3;

Xor dc A B x1;
Xor dd x1 Cin x2;
And de x2 on0 output0;
And ec A B on0 x3;
And ed x1 Cin on0 x4;
Or fc x3 x4 Cout;
Or be output0 output1 output2 output3 S;

Endef;

Define ALU16 a[15..0] b[15..0] c[1..0] | s[15..0] N Z;

ALU1 ap a[0] b[0] ZERO c[1] c[0] | s[0] Cr0;
ALU1 ao a[1] b[1] Cr0 c[1] c[0] | s[1] Cr1;
ALU1 an a[2] b[2] Cr1 c[1] c[0] | s[2] Cr2;
ALU1 am a[3] b[3] Cr2 c[1] c[0] | s[3] Cr3;
ALU1 al a[4] b[4] Cr3 c[1] c[0] | s[4] Cr4;
ALU1 ak a[5] b[5] Cr4 c[1] c[0] | s[5] Cr5;
ALU1 aj a[6] b[6] Cr5 c[1] c[0] | s[6] Cr6;
ALU1 ai a[7] b[7] Cr6 c[1] c[0] | s[7] Cr7;
ALU1 ah a[8] b[8] Cr7 c[1] c[0] | s[8] Cr8;
ALU1 ag a[9] b[9] Cr8 c[1] c[0] | s[9] Cr9;
ALU1 af a[10] b[10] Cr9 c[1] c[0] | s[10] Cr10;
ALU1 ae a[11] b[11] Cr10 c[1] c[0] | s[11] Cr11;
ALU1 ad a[12] b[12] Cr11 c[1] c[0] | s[12] Cr12;
ALU1 ac a[13] b[13] Cr12 c[1] c[0] | s[13] Cr13;
ALU1 ab a[14] b[14] Cr13 c[1] c[0] | s[14] Cr14;
ALU1 aa a[15] b[15] Cr14 c[1] c[0] | s[15] Cr15;

Or ba s[15] N;
Or bb s[0] s[1] s[2] s[3] s[4] s[5] s[6] s[7] s[8] s[9] s[10] s[11] s[12] s[13] s[14] s[15] NZ;
Not bc NZ Z;

Endef;



/* Shifter - Josh Walker, CS355, Fall 1999 */

Define Shifter1 a[2..0] c[1..0] | s;
Not aa c[1] Nc1;
Not ab c[0] Nc0;
And ac a[0] c[1] Nc0 Right;
And ba a[1] Nc1 Nc0 Center;
And bb a[2] Nc1 c[0] Left;
Or bc Right Center Left s;
Endef;

Define SHIFTER16 a[15..0] c[1..0] | s[15..0];
Shifter1 aa a[1] a[0] ZERO c[1] c[0] | s[0];
Shifter1 ab a[2] a[1] a[0] c[1] c[0] | s[1];
Shifter1 ac a[3] a[2] a[1] c[1] c[0] | s[2];
Shifter1 ad a[4] a[3] a[2] c[1] c[0] | s[3];
Shifter1 ae a[5] a[4] a[3] c[1] c[0] | s[4];
Shifter1 af a[6] a[5] a[4] c[1] c[0] | s[5];
Shifter1 ag a[7] a[6] a[5] c[1] c[0] | s[6];
Shifter1 ah a[8] a[7] a[6] c[1] c[0] | s[7];
Shifter1 ai a[9] a[8] a[7] c[1] c[0] | s[8];
Shifter1 aj a[10] a[9] a[8] c[1] c[0] | s[9];
Shifter1 ak a[11] a[10] a[9] c[1] c[0] | s[10];
Shifter1 al a[12] a[11] a[10] c[1] c[0] | s[11];
Shifter1 am a[13] a[12] a[11] c[1] c[0] | s[12];
Shifter1 an a[14] a[13] a[12] c[1] c[0] | s[13];
Shifter1 ao a[15] a[14] a[13] c[1] c[0] | s[14];
Shifter1 ap ZERO a[15] a[14] c[1] c[0] | s[15];
Endef;
