@@ -20,8 +20,8 @@ return testbed.module({
2020 { name = " instr" , index = 5 , keepalive = 0x30000000 , payload = 0x0001FFFF , initial = 0x30000000 },
2121 },
2222 outputs = {
23- { name = " carries" , index = 1 , keepalive = 0x10000000 , payload = 0x07FFFFFE },
24- { name = " sums_high" , index = 3 , keepalive = 0x10000000 , payload = 0x07FFFFFF },
23+ { name = " carries" , index = 1 , keepalive = 0x10000000 , payload = 0x0FFFFFFE }, -- bit 27 is ignored by downstream components
24+ { name = " sums_high" , index = 3 , keepalive = 0x10000000 , payload = 0x0FFFFFFF }, -- bit 27 is ignored by downstream components
2525 { name = " sums_low" , index = 5 , keepalive = 0x10000000 , payload = 0x0000001F },
2626 },
2727 func = function (inputs )
@@ -54,7 +54,10 @@ return testbed.module({
5454 p_15 :bxor (0x10000 ), partial [15 ]
5555 )
5656 end
57- local function full_adder (x , y , z , sk , sp , ck , cp )
57+ for i = 0 , 15 do
58+ partial [i ]:label (" p_" .. i )
59+ end
60+ local function full_adder (label , x , y , z , sk , sp , ck , cp )
5861 local function try (x , y , z )
5962 if bitx .bxor (x .keepalive_ , y .keepalive_ ) == 0 or
6063 bitx .band (x .keepalive_ , y .keepalive_ ) == 0 then
@@ -74,32 +77,30 @@ return testbed.module({
7477 local result = assert (try (x , y , z ) or
7578 try (y , z , x ) or
7679 try (z , x , y ))
77- return result .s :assert (sk , sp ),
78- result .c :assert (ck , cp )
80+ return result .s :assert (sk , sp ): label ( " s_ " .. label ) ,
81+ result .c :assert (ck , cp ): label ( " c_ " .. label )
7982 end
80- local s_1a , c_1a = full_adder (partial [ 0 ] , partial [ 1 ]:lshift (2 ), partial [ 2 ]:lshift (4 ), 0x3D000000 , 0x0003FFFF , 0x3E000000 , 0x0001FFFE )
81- local s_1b , c_1b = full_adder (partial [ 3 ] , partial [ 4 ]:lshift (2 ), partial [ 5 ]:lshift (4 ), 0x3D000000 , 0x0003FFFF , 0x3E000000 , 0x0001FFFE )
82- local s_1c , c_1c = full_adder (partial [ 6 ] , partial [ 7 ]:lshift (2 ), partial [ 8 ]:lshift (4 ), 0x3D000000 , 0x0003FFFF , 0x3E000000 , 0x0001FFFE )
83- local s_1d , c_1d = full_adder (partial [ 9 ] , partial [10 ]:lshift (2 ), partial [11 ]:lshift (4 ), 0x3D000000 , 0x0003FFFF , 0x3E000000 , 0x0001FFFE )
84- local s_1e , c_1e = full_adder (partial [12 ] , partial [13 ]:lshift (2 ), partial [14 ]:lshift (4 ), 0x3D000000 , 0x0003FFFF , 0x3E000000 , 0x0001FFFE )
85- local s_2a , c_2a = full_adder (c_1a :lshift (2 ), s_1a :bxor (0x01000000 ), s_1b :lshift (8 ) , 0x28000000 , 0x001FFFFF , 0x3C000000 , 0x0003FFFC )
86- local s_2b , c_2b = full_adder (c_1b , s_1c :lshift (4 ) , c_1c :lshift (8 ) , 0x3A000000 , 0x000FFFFE , 0x34000000 , 0x000FFFFC )
87- local s_2c , c_2c = full_adder (c_1d :lshift (2 ), s_1d :bxor (0x01000000 ), s_1e :lshift (8 ) , 0x28000000 , 0x001FFFFF , 0x3C000000 , 0x0003FFFC )
88- local s_3a , c_3a = full_adder (s_2a , c_2a :lshift (2 ) , s_2b :lshift (0x10 ) , 0x30000000 , 0x00FFFFFF , 0x28000000 , 0x001FFFF8 )
89- local s_3b , c_3b = full_adder (s_2c , c_2c :lshift (2 ) , c_1e :lshift (0x10 ) , 0x30000000 , 0x001FFFFF , 0x28000000 , 0x001FFFF8 )
83+ local s_1a , c_1a = full_adder (" 1a " , partial [ 0 ] , partial [ 1 ]:lshift (2 ), partial [ 2 ]:lshift (4 ), 0x3D000000 , 0x0003FFFF , 0x3E000000 , 0x0001FFFE )
84+ local s_1b , c_1b = full_adder (" 1b " , partial [ 3 ] , partial [ 4 ]:lshift (2 ), partial [ 5 ]:lshift (4 ), 0x3D000000 , 0x0003FFFF , 0x3E000000 , 0x0001FFFE )
85+ local s_1c , c_1c = full_adder (" 1c " , partial [ 6 ] , partial [ 7 ]:lshift (2 ), partial [ 8 ]:lshift (4 ), 0x3D000000 , 0x0003FFFF , 0x3E000000 , 0x0001FFFE )
86+ local s_1d , c_1d = full_adder (" 1d " , partial [ 9 ] , partial [10 ]:lshift (2 ), partial [11 ]:lshift (4 ), 0x3D000000 , 0x0003FFFF , 0x3E000000 , 0x0001FFFE )
87+ local s_1e , c_1e = full_adder (" 1e " , partial [12 ] , partial [13 ]:lshift (2 ), partial [14 ]:lshift (4 ), 0x3D000000 , 0x0003FFFF , 0x3E000000 , 0x0001FFFE )
88+ local s_2a , c_2a = full_adder (" 2a " , c_1a :lshift (2 ), s_1a :bxor (0x01000000 ), s_1b :lshift (8 ) , 0x28000000 , 0x001FFFFF , 0x3C000000 , 0x0003FFFC )
89+ local s_2b , c_2b = full_adder (" 2b " , c_1b , s_1c :lshift (4 ) , c_1c :lshift (8 ) , 0x3A000000 , 0x000FFFFE , 0x34000000 , 0x000FFFFC )
90+ local s_2c , c_2c = full_adder (" 2c " , c_1d :lshift (2 ), s_1d :bxor (0x01000000 ), s_1e :lshift (8 ) , 0x28000000 , 0x001FFFFF , 0x3C000000 , 0x0003FFFC )
91+ local s_3a , c_3a = full_adder (" 3a " , s_2a , c_2a :lshift (2 ) , s_2b :lshift (0x10 ) , 0x30000000 , 0x00FFFFFF , 0x28000000 , 0x001FFFF8 )
92+ local s_3b , c_3b = full_adder (" 3b " , s_2c , c_2c :lshift (2 ) , c_1e :lshift (0x10 ) , 0x30000000 , 0x001FFFFF , 0x28000000 , 0x001FFFF8 )
9093 local c_2b_adjusted = c_2b :bxor (0x00200000 ):lshift (0x20 ):bxor (0x20000000 )
91- local s_4a , c_4a = full_adder (s_3a , c_3a :lshift (2 ) , c_2b_adjusted , 0x04000000 , 0x01FFFFFF , 0x30000000 , 0x00FFFFF0 )
94+ local s_4a , c_4a = full_adder (" 4a " , s_3a , c_3a :lshift (2 ) , c_2b_adjusted , 0x04000000 , 0x01FFFFFF , 0x30000000 , 0x00FFFFF0 )
9295 local p_15_adjusted = partial [15 ]:bxor (0x00200000 ):lshift (0x40 ):bxor (0x20000000 )
93- local s_4b , c_4b = full_adder (s_3b , c_3b :lshift (2 ) , p_15_adjusted , 0x08000000 , 0x007FFFFF , 0x30000000 , 0x003FFFF0 )
96+ local s_4b , c_4b = full_adder (" 4b " , s_3b , c_3b :lshift (2 ) , p_15_adjusted , 0x08000000 , 0x007FFFFF , 0x30000000 , 0x003FFFF0 )
9497 local c_4b_adjusted = c_4b :bxor (0x01000000 ):lshift (0x20 ):bxor (0x10000000 )
9598 local c_4a_adjusted = c_4a :bxor (0x20000000 ):rshift (0x10 ):bxor (0x30000000 ):bxor (0x01000000 )
9699 local s_4b_adjusted = s_4b :bxor (0x01000000 ):lshift (0x10 )
97- local s_5a , c_5a = full_adder (s_4b_adjusted , c_4b_adjusted , c_4a_adjusted , 0x10000000 , 0x07FFFFFF , 0x30000000 , 0x07FFFFF0 )
98- c_5a :force (0x30000000 , 0x03FFFFF0 )
100+ local s_5a , c_5a = full_adder (" 5a" , s_4b_adjusted , c_4b_adjusted , c_4a_adjusted , 0x10000000 , 0x07FFFFFF , 0x30000000 , 0x07FFFFF0 )
99101 local s_4a_adjusted = s_4a :rshift (0x20 ):bxor (0x30000000 ):bxor (0x00200000 )
100102 local c_5a_adjusted = c_5a :lshift (2 ):bxor (0x10000000 )
101- local s_6a , c_6a = full_adder (c_5a_adjusted , s_4a_adjusted , s_5a , 0x10000000 , 0x07FFFFFF , 0x30000000 , 0x07FFFFFF )
102- c_6a :force (0x30000000 , 0x03FFFFFF )
103+ local s_6a , c_6a = full_adder (" 6a" , c_5a_adjusted , s_4a_adjusted , s_5a , 0x10000000 , 0x0FFFFFFF , 0x30000000 , 0x07FFFFFF )
103104 return {
104105 carries = c_6a :lshift (2 ):bxor (0x30000000 ),
105106 sums_high = s_6a ,
0 commit comments