- assign isplus = inOp_d[2:0]==2;
- assign cin = isplus ? 0 : 1;
- assign in2_inverted = isplus ? in2_d : ~in2_d;
- assign sum = {in1_d,cin} + {in2_inverted,cin};
- assign res = sum[`DATAWIDTH:1];
- assign greater = !res[`DATAWIDTH-1];
- assign eq = in1_d == in2_d;
- assign cout = sum[`DATAWIDTH];
-
- assign out_d_[`DATAWIDTH] =
- (inOp_d==0) ? 1'b0 :
- (inOp_d==1) ? 1'b0 :
- (inOp_d==2) ? cout :
- (inOp_d==3) ? 1'b0 :
- (inOp_d==4) ? ~greater :
- (inOp_d==5) ? greater :
- (inOp_d==6) ? eq :
+ wire [4:0] inOp_d_trunc;
+ assign inOp_d_trunc = inOp_d[4:0];
+
+ assign isplus = inOp_d_trunc[4:0]==2;
+ assign cin = isplus ? 0 : 1;
+ assign in2_inverted = isplus ? in2_d : ~in2_d;
+ assign sum = {in1_d,cin} + {in2_inverted,cin};
+ assign res = sum[`WORDWIDTH:1];
+ assign greater = !res[`WORDWIDTH-1];
+ assign both_negative = in1_d[`WORDWIDTH-1] && in2_d[`WORDWIDTH-1];
+ assign eq = in1_d == in2_d;
+ assign cout = sum[`WORDWIDTH];
+
+ reg out_draining;
+
+ assign out_d_[`WORDWIDTH] =
+ (inOp_d_trunc==0) ? 1'b0 :
+ (inOp_d_trunc==1) ? 1'b0 :
+ (inOp_d_trunc==2) ? cout :
+ (inOp_d_trunc==3) ? cout :
+ (inOp_d_trunc==4) ? ~greater :
+ (inOp_d_trunc==5) ? greater :
+ (inOp_d_trunc==6) ? eq :
+ (inOp_d_trunc==9) ? ~greater :