Skip to content

Commit 178bff1

Browse files
committed
Eliminate :force calls
1 parent 2ed2e79 commit 178bff1

9 files changed

Lines changed: 57 additions & 53 deletions

File tree

r3/build.lua

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
local runner = require("spaghetti.runner")
22

3-
local function run(modname_with_params, core_type, output_type, output_view, verb, output_file)
3+
local function run(modname_with_params, output_type, output_view, verb, output_file)
44
output_type = output_type or "plot"
5-
output_type = output_type or "none"
5+
output_view = output_view or "none"
66
verb = verb or "build"
77
local modname
88
local module_params = {}
@@ -19,13 +19,13 @@ local function run(modname_with_params, core_type, output_type, output_view, ver
1919
end
2020
end
2121
runner.run_internal({
22-
module = require(modname),
22+
module = require(modname),
2323
module_params = module_params,
24-
output = output_file,
25-
vt100 = true,
26-
fuzz = verb == "fuzz",
27-
output_view = output_view,
28-
output_type = output_type,
24+
output = output_file,
25+
vt100 = true,
26+
fuzz = verb == "fuzz",
27+
output_view = output_view,
28+
output_type = output_type,
2929
design_params = {
3030
probes = verb == "fuzz",
3131
},

r3/comp/cpu/core/alu/adder.lua

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ local bitx = require("spaghetti.bitx")
33
local testbed = require("spaghetti.testbed")
44

55
return testbed.module(function(params)
6-
local payload = params.core_type == "m" and 0x07FFFFFF or 0x0000FFFF
6+
local payload = params.core_type == "m" and 0x0FFFFFFF or 0x0000FFFF
77
return {
88
tag = "core.alu.adder",
99
opt_params = {
@@ -25,7 +25,7 @@ return testbed.module(function(params)
2525
outputs = {
2626
{ name = "res_add" , index = 1, keepalive = 0x10000000, payload = 0x0000FFFF },
2727
{ name = "overflow_carry", index = 3, keepalive = 0x10000000, payload = 0x00000003 },
28-
params.core_type == "m" and { name = "sum_27", index = 5, keepalive = 0x10000000, payload = 0x07FFFFFF } or nil,
28+
params.core_type == "m" and { name = "sum_27", index = 5, keepalive = 0x10000000, payload = 0x0FFFFFFF } or nil,
2929
},
3030
func = function(inputs)
3131
local lhs_ka = inputs.pri:bor(0x20000000):assert(0x30000000, payload)
@@ -57,7 +57,7 @@ return testbed.module(function(params)
5757
if params.core_type == "m" then
5858
local generate_27 = propagate:band(spaghetti.lshiftk(generate:bor(0x1000), 16):bor(0x20000000)):bor(generate)
5959
local carries_27 = spaghetti.lshiftk(generate_27, 1)
60-
outputs.sum_27 = onebit_sums:bxor(carries_27:bor(0x10000000)):assert(0x10000000, 0x0FFFFFFF):force(0x10000000, 0x07FFFFFF)
60+
outputs.sum_27 = onebit_sums:bxor(carries_27:bor(0x10000000)):assert(0x10000000, 0x0FFFFFFF)
6161
carries_no_in = carries_no_in:band(0x1000FFFF):assert(0x10000000, 0x0000FFFF)
6262
end
6363
local carries = spaghetti.lshiftk(carries_no_in, 1):bor(carry_in):assert(0x30000000, 0x0001FFFF)
@@ -115,7 +115,7 @@ return testbed.module(function(params)
115115
local sec_27 = bitx.band(inputs.sec, 0x7FFFFFF)
116116
local sum_27 = pri_27 + sec_27
117117
local check_27 = bitx.band(inputs.instr, 0x000E) == 0x000E
118-
outputs.sum_27 = check_27 and bitx.bor(0x10000000, sum_27) or false
118+
outputs.sum_27 = check_27 and { value = bitx.bor(0x10000000, sum_27), mask = 0x17FFFFFF } or false
119119
end
120120
return outputs
121121
end,

r3/comp/cpu/core/alu/csmult.lua

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -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,

r3/comp/cpu/core/alu/csmult.txt

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -257,39 +257,33 @@ s_4a: 0 0 0 1 0 x x x x x x x x x x x x x x x x x
257257
s_5a: 0 1 0 x x x x x x x x x x x x x x x x x x x x x x x x x x x
258258
c_5a: 1 1 0 x x x x x x x x x x x x x x x x x x x x x x x 0 0 0 0
259259

260-
but c_5a[26] can never be 1
261-
262-
s_4a: 0 0 0 1 0 x x x x x x x x x x x x x x x x x x x x x x x x x
263-
s_5a: 0 1 0 x x x x x x x x x x x x x x x x x x x x x x x x x x x
264-
c_5a: 1 1 0 0 x x x x x x x x x x x x x x x x x x x x x x 0 0 0 0
260+
c_5a[26] is an artefact of the signed multiplication technique and does not contribute to the result
265261

266262
(group)
267263

268264
s_4a: 0 0 0 1 0 a a a a a a a a a a a a a a a a a a a a a a a a a
269265
s_5a: 0 1 0 a a a a a a a a a a a a a a a a a a a a a a a a a a a
270-
c_5a: 1 1 0 0 a a a a a a a a a a a a a a a a a a a a a a 0 0 0 0
266+
c_5a: 1 1 0 a a a a a a a a a a a a a a a a a a a a a a a 0 0 0 0
271267

272268
s_4a >>= 5 (low 5 bits saved elsewhere)
273269
c_5a <<= 1
274270

275271
s_4a: 0 0 0 0 0 0 0 0 1 0 a a a a a a a a a a a a a a a a a a a a
276272
s_5a: 0 1 0 a a a a a a a a a a a a a a a a a a a a a a a a a a a
277-
c_5a: 1 0 0 a a a a a a a a a a a a a a a a a a a a a a 0 0 0 0 0
273+
c_5a: 1 0 a a a a a a a a a a a a a a a a a a a a a a a 0 0 0 0 0
278274

279275
s_4a ^= 30000000
280276
c_5a ^= 10000000
281277
s_4a ^= 00200000
282278

283279
s_4a: 1 1 0 0 0 0 0 0 0 0 a a a a a a a a a a a a a a a a a a a a
284280
s_5a: 0 1 0 a a a a a a a a a a a a a a a a a a a a a a a a a a a
285-
c_5a: 1 1 0 a a a a a a a a a a a a a a a a a a a a a a 0 0 0 0 0
281+
c_5a: 1 1 a a a a a a a a a a a a a a a a a a a a a a a 0 0 0 0 0
286282

287283
(reduce)
288284

289-
s_6a: 0 1 0 a a a a a a a a a a a a a a a a a a a a a a a a a a a
285+
s_6a: 0 1 a a a a a a a a a a a a a a a a a a a a a a a a a a a a
290286
c_6a: 1 1 0 a a a a a a a a a a a a a a a a a a a a a a a a a a a
291287

292-
but c_6a[26] can never be 1
293-
294-
s_6a: 0 1 0 a a a a a a a a a a a a a a a a a a a a a a a a a a a
295-
c_6a: 1 1 0 0 a a a a a a a a a a a a a a a a a a a a a a a a a a
288+
s_6a[27] is an artefact of the signed multiplication technique and does not contribute to the result
289+
c_6a[26] is an artefact of the signed multiplication technique and does not contribute to the result

r3/comp/cpu/core/alu/shifter.lua

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ return testbed.module({
2323
{ name = "res_shr", index = 3, keepalive = 0x10000000, payload = 0x0000FFFF },
2424
},
2525
func = function(inputs)
26+
local occ = spaghetti.occ_domain("shifter")
27+
inputs.pri:occ_root(occ, "pri", "auto")
28+
inputs.sec:occ_root(occ, "sec", "auto")
2629
local shift_total = spaghetti.constant(0x8000)
2730
for i = 0, 3 do
2831
local i22 = bitx.lshift(1, bitx.lshift(1, i))
@@ -33,10 +36,10 @@ return testbed.module({
3336
local right = inputs.pri:rshift(shift_total):never_zero()
3437
:bxor(0x30000000)
3538
:bxor(keepalive_shifted)
36-
:bxor(0x20000000):force(0x10000000, 0x0000FFFF)
39+
:bxor(0x20000000):occ_force(occ, "right", 0x10000000, 0x0000FFFF)
3740
local left = inputs.pri:bor(keepalive_shifted)
3841
:lshift(shift_total):never_zero()
39-
:band(0x1000FFFF):force(0x10000000, 0x0000FFFF)
42+
:band(0x1000FFFF):occ_force(occ, "left", 0x10000000, 0x0000FFFF)
4043
return {
4144
res_shl = left,
4245
res_shr = right,

r3/comp/cpu/core/flags_sel.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ return testbed.module(function(params)
3838
flags_out = flags_out:bor(spaghetti.lshiftk(inputs.res_mull:band(spaghetti.constant(0x3FFFFFFF):lshift(shift_by)):bor(0x01000000), 4))
3939
else
4040
-- subtle: s cores can potentially execute mull too, but its encoding already disables updating flags
41-
flags_out:force(0x10000000, 0x000FFFFF)
41+
flags_out:relax_payload(0x000FFFFF)
4242
end
4343
return {
4444
flags = flags_out,

r3/comp/cpu/core/state_next.lua

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ return testbed.module({
2424
{ name = "state", index = 1, keepalive = 0x10000000, payload = 0x0000000F },
2525
},
2626
func = function(inputs)
27+
local occ = spaghetti.occ_domain("state_next")
28+
inputs.instr :occ_root(occ, "instr" , "auto")
29+
inputs.sync_bit:occ_root(occ, "sync_bit", "auto")
30+
inputs.state :occ_root(occ, "state" , "auto")
2731
local instr_not_ld = util.op_is_not_k(inputs.instr, 2)
2832
local instr_not_st = util.op_is_not_k(inputs.instr, 10)
2933
local instr_not_hlt = util.op_is_not_k(inputs.instr, 13)
@@ -39,7 +43,7 @@ return testbed.module({
3943
local ehalt_shift = wo_ehalt:bor(0x1000):band(spaghetti.rshiftk(inputs.sync_bit, 4)):bor(8)
4044
local state = wo_ehalt:lshift(8):never_zero()
4145
:rshift(ehalt_shift):never_zero()
42-
:bor(0x10000000):force(0x10000000, 0x0000000F) -- spaghetti insists that this can be 7F
46+
:bor(0x10000000):occ_force(occ, "state_next", 0x10000000, 0x0000000F)
4347
return {
4448
state = state,
4549
}

r3/comp/terminal/core/range_to_rbits.lua

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ return testbed.module({
2525
{ name = "bit_high", index = 3, keepalive = 0x00000000, payload = mask_mask, never_zero = true },
2626
},
2727
func = function(inputs)
28+
local occ = spaghetti.occ_domain("range_to_rbits")
29+
inputs.range:occ_root(occ, "range", "auto")
2830
local range_above28 = inputs.range:band(spaghetti.rshiftk(inputs.range, 1):bor(0x10000000))
2931
:band(spaghetti.rshiftk(inputs.range, 2):bor(0x10000000)):assert(0x10000000, 0x000000FF)
3032
local range_above28_bits = range_above28:bsub(0x40):bsub(0x20):bsub(0x10):bsub(0x08):bsub(0x03):assert(0x10000000, 0x00000084)
@@ -42,8 +44,8 @@ return testbed.module({
4244
end
4345
end
4446
return {
45-
bit_low = shift_total[0]:force(0x00000000, mask_mask),
46-
bit_high = shift_total[1]:force(0x00000000, mask_mask),
47+
bit_low = shift_total[0]:occ_force(occ, "bit_low" , 0x00000000, mask_mask),
48+
bit_high = shift_total[1]:occ_force(occ, "bit_high", 0x00000000, mask_mask),
4749
}
4850
end,
4951
fuzz_inputs = function()

0 commit comments

Comments
 (0)