Skip to content

Commit

Permalink
add RGB_DRV/LED_DRV_CUR for u4k
Browse files Browse the repository at this point in the history
  • Loading branch information
corecode committed Jun 10, 2019
1 parent 0f5feea commit 56978cd
Show file tree
Hide file tree
Showing 11 changed files with 329 additions and 37 deletions.
32 changes: 32 additions & 0 deletions icebox/icebox.py
Original file line number Diff line number Diff line change
Expand Up @@ -5801,6 +5801,38 @@ def parse_db(text, device="1k"):
("SMCCLK", (25, 3, 0)) : {
"CLK": (25, 3, "slf_op_5")
},
("LED_DRV_CUR", (25, 21, 2)) : {
"LED_DRV_CUR_EN": (25, 19, "CBIT_5"),
"EN": (25, 19, "lutff_6/in_3"),
},
("RGB_DRV", (0, 21, 3)) : {
"RGB_DRV_EN": (0, 18, "CBIT_5"),
"RGB0_CURRENT_0": (0, 18, "CBIT_6"),
"RGB0_CURRENT_1": (0, 18, "CBIT_7"),
"RGB0_CURRENT_2": (0, 19, "CBIT_0"),
"RGB0_CURRENT_3": (0, 19, "CBIT_1"),
"RGB0_CURRENT_4": (0, 19, "CBIT_2"),
"RGB0_CURRENT_5": (0, 19, "CBIT_3"),
"RGB1_CURRENT_0": (0, 19, "CBIT_4"),
"RGB1_CURRENT_1": (0, 19, "CBIT_5"),
"RGB1_CURRENT_2": (0, 19, "CBIT_6"),
"RGB1_CURRENT_3": (0, 19, "CBIT_7"),
"RGB1_CURRENT_4": (0, 20, "CBIT_0"),
"RGB1_CURRENT_5": (0, 20, "CBIT_1"),
"RGB2_CURRENT_0": (0, 20, "CBIT_2"),
"RGB2_CURRENT_1": (0, 20, "CBIT_3"),
"RGB2_CURRENT_2": (0, 20, "CBIT_4"),
"RGB2_CURRENT_3": (0, 20, "CBIT_5"),
"RGB2_CURRENT_4": (0, 20, "CBIT_6"),
"RGB2_CURRENT_5": (0, 20, "CBIT_7"),
"RGBLEDEN": (0, 20, "lutff_1/in_1"),
"RGB0PWM": (0, 20, "lutff_2/in_1"),
"RGB1PWM": (0, 20, "lutff_3/in_1"),
"RGB2PWM": (0, 20, "lutff_4/in_1"),
"RGB0": (13, 21, 0),
"RGB1": (12, 21, 0),
"RGB2": (8, 21, 0)
},
}
}

Expand Down
4 changes: 2 additions & 2 deletions icefuzz/extract.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@
cur_text_db = text_db.setdefault("ipcon_5k", set())
ignore = False
elif device_class == "u4k" and line.startswith("IpCon"):
cur_text_db = text_db.setdefault("ipcon_u4k", set())
cur_text_db = text_db.setdefault("ipcon_5k", set())
ignore = False
elif device_class == "5k" and line.startswith("DSP"):
match = re.match(r"DSP_Tile_\d+_(\d+)", line)
Expand Down Expand Up @@ -71,7 +71,7 @@
if ypos in [8, 16]:
dsp_idx = 3
assert dsp_idx != None
cur_text_db = text_db.setdefault("dsp%d_u4k" % dsp_idx, set())
cur_text_db = text_db.setdefault("dsp%d_5k" % dsp_idx, set())
ignore = False
elif not ignore:
print("'" + line + "'")
Expand Down
68 changes: 33 additions & 35 deletions icefuzz/make_uip.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ def randbin(n):
module top (
input [%d:0] glb_pins,
input [%d:0] in_pins,
output [15:0] out_pins,
input [2:0] led_data,
output [%d:0] led_pins
);
wire [%d:0] glb, glb_pins;
Expand Down Expand Up @@ -92,39 +92,39 @@ def randbin(n):
# bits.append("pwm_out[1]")
# bits.append("pwm_out[2]")

# current_choices = ["0b000000", "0b000001", "0b000011", "0b000111", "0b001111", "0b011111", "0b111111"]
current_choices = ["0b000000", "0b000001", "0b000011", "0b000111", "0b001111", "0b011111", "0b111111"]

# currents = [np.random.choice(current_choices) for i in range(3)]
currents = [np.random.choice(current_choices) for i in range(3)]

# bit_curren = np.random.choice(bits)
# bit_rgbleden = np.random.choice(bits)
# bits_pwm = [np.random.choice([np.random.choice(bits), "pwm_out[%d]" % i]) for i in range(3)]
bit_curren = np.random.choice(bits)
bit_rgbleden = np.random.choice(bits)
bits_pwm = [np.random.choice([np.random.choice(bits), "led_data[%d]" % i]) for i in range(3)]

# print("""
# wire rgbpu;
# SB_LED_DRV_CUR led_drv_cur (
# .EN(%s),
# .LEDPU(rgbpu)
# );

# SB_RGB_DRV #(
# .RGB0_CURRENT(\"%s\"),
# .RGB1_CURRENT(\"%s\"),
# .RGB2_CURRENT(\"%s\")
# ) rgb_drv (
# .RGBLEDEN(%s),
# .RGBPU(rgbpu),
# .RGB0PWM(%s),
# .RGB1PWM(%s),
# .RGB2PWM(%s),
# .RGB0(led_pins[0]),
# .RGB1(led_pins[1]),
# .RGB2(led_pins[2])
# );
# """ % (
# bit_curren, currents[0], currents[1], currents[2],
# bit_rgbleden, bits_pwm[0], bits_pwm[1], bits_pwm[2]
# ), file = f)
print("""
wire rgbpu;
SB_LED_DRV_CUR led_drv_cur (
.EN(%s),
.LEDPU(rgbpu)
);
SB_RGB_DRV #(
.RGB0_CURRENT(\"%s\"),
.RGB1_CURRENT(\"%s\"),
.RGB2_CURRENT(\"%s\")
) rgb_drv (
.RGBLEDEN(%s),
.RGBPU(rgbpu),
.RGB0PWM(%s),
.RGB1PWM(%s),
.RGB2PWM(%s),
.RGB0(led_pins[0]),
.RGB1(led_pins[1]),
.RGB2(led_pins[2])
);
""" % (
bit_curren, currents[0], currents[1], currents[2],
bit_rgbleden, bits_pwm[0], bits_pwm[1], bits_pwm[2]
), file = f)

# TODO: I2C and SPI

Expand All @@ -133,9 +133,7 @@ def randbin(n):
p = list(np.random.permutation(pins))
for i in range(len(pins) - len(glbs) - 16):
print("set_io in_pins[%d] %s" % (i, p.pop()), file=f)
for i in range(16):
print("set_io out_pins[%d] %s" % (i, p.pop()), file=f)
# for i in range(len(led_pins)):
# print("set_io led_pins[%d] %s" % (i, led_pins[i]), file=f)
for i in range(len(led_pins)):
print("set_io led_pins[%d] %s" % (i, led_pins[i]), file=f)

output_makefile(working_dir, "uip")
1 change: 1 addition & 0 deletions icefuzz/tests/rgb_drv_cbit/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
work_rgb_drv/
181 changes: 181 additions & 0 deletions icefuzz/tests/rgb_drv_cbit/fuzz_rgb_drv_cbit.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,181 @@
#!/usr/bin/env python3

import os, sys
# SB_RGB_DRV automatic fuzzing script

device = "u4k"

# SB_RGB_DRV config bits to be fuzzed
# These must be in an order such that a config with bit i set doesn't set any other undiscovered bits yet


fuzz_bits = [
"RGB0_CURRENT_0",
"RGB0_CURRENT_1",
"RGB0_CURRENT_2",
"RGB0_CURRENT_3",
"RGB0_CURRENT_4",
"RGB0_CURRENT_5",

"RGB1_CURRENT_0",
"RGB1_CURRENT_1",
"RGB1_CURRENT_2",
"RGB1_CURRENT_3",
"RGB1_CURRENT_4",
"RGB1_CURRENT_5",

"RGB2_CURRENT_0",
"RGB2_CURRENT_1",
"RGB2_CURRENT_2",
"RGB2_CURRENT_3",
"RGB2_CURRENT_4",
"RGB2_CURRENT_5"
]


# Boilerplate code based on the icefuzz script
code_prefix = """
module top(
input curren,
input rgbleden,
input r_in,
input g_in,
input b_in,
output r_led,
output g_led,
output b_led);
"""

def get_param_value(param_name, param_size, fuzz_bit):
param = "\"0b";
#In the RGB driver, once bit i of a current parameter is set i-1..0 must also be set
is_high = False
for i in range(param_size - 1, -1, -1):
if fuzz_bit == param_name + "_" + str(i) or is_high:
param += '1'
is_high = True
else:
param += '0'
param += "\""
return param
def inst_rgb(fuzz_bit):
v = ""
v += """wire ledpu;
SB_LED_DRV_CUR led_cur_inst (
.EN(curren),
.LEDPU(ledpu));
"""
v += """SB_RGB_DRV rgb_inst (
.RGBPU(ledpu),
.RGBLEDEN(rgbleden),
.RGB0PWM(r_in),
.RGB1PWM(g_in),
.RGB2PWM(b_in),
.RGB0(r_led),
.RGB1(g_led),
.RGB2(b_led)
);
"""

v += "defparam rgb_inst.RGB0_CURRENT = " + get_param_value("RGB0_CURRENT", 6, fuzz_bit) + ";\n"
v += "defparam rgb_inst.RGB1_CURRENT = " + get_param_value("RGB1_CURRENT", 6, fuzz_bit) + ";\n"
v += "defparam rgb_inst.RGB2_CURRENT = " + get_param_value("RGB2_CURRENT", 6, fuzz_bit) + ";\n"

return v;

def make_vlog(fuzz_bit):
vlog = code_prefix
vlog += inst_rgb(fuzz_bit)
vlog += "endmodule"
return vlog

known_bits = []

# Set to true to continue even if multiple bits are changed (needed because
# of the issue discusssed below)
show_all_bits = False #TODO: make this an argument

#HACK: icecube doesn't let you set all of the config bits to 0,
#which makes fuzzing early on annoying as there is never a case
#with just 1 bit set. So a tiny bit of semi-manual work is needed
#first to discover this (basically run this script with show_all_bits=True
#and look for the stuck bit)
#TODO: clever code could get rid of this
rgb_drv_en_bit = {
"u4k" : (0, 18, 5)
}

led_drv_cur_en_bit = {
"u4k" : (25, 19, 5)
}

#Return a list of RGB_DRIVER config bits in the format (x, y, bit)
def parse_exp(expfile):
current_x = 0
current_y = 0
bits = []
with open(expfile, 'r') as f:
for line in f:
splitline = line.split(' ')
if splitline[0].endswith("_tile"):
current_x = int(splitline[1])
current_y = int(splitline[2])
elif splitline[0] == "IpConfig":
if splitline[1][:5] == "CBIT_":
bitidx = int(splitline[1][5:])
bits.append((current_x, current_y, bitidx))
return bits

#Convert a bit tuple as returned from the above to a nice string
def bit_to_str(bit):
return "(%d, %d, \"CBIT_%d\")" % bit

#The main fuzzing function
def do_fuzz():
if not os.path.exists("./work_rgb_drv"):
os.mkdir("./work_rgb_drv")
known_bits.append(rgb_drv_en_bit[device])
known_bits.append(led_drv_cur_en_bit[device])
with open("rgb_drv_data_" + device + ".txt", 'w') as dat:
for fuzz_bit in fuzz_bits:
vlog = make_vlog(fuzz_bit)
with open("./work_rgb_drv/rgb_drv.v", 'w') as f:
f.write(vlog)
with open("./work_rgb_drv/rgb_drv.pcf", 'w') as f:
f.write("""
set_io r_led 39
set_io g_led 40
set_io b_led 41
""")
retval = os.system("bash ../../icecube.sh -" + device + " ./work_rgb_drv/rgb_drv.v > ./work_rgb_drv/icecube.log 2>&1")
if retval != 0:
sys.stderr.write('ERROR: icecube returned non-zero error code\n')
sys.exit(1)
retval = os.system("../../../icebox/icebox_explain.py ./work_rgb_drv/rgb_drv.asc > ./work_rgb_drv/rgb_drv.exp")
if retval != 0:
sys.stderr.write('ERROR: icebox_explain returned non-zero error code\n')
sys.exit(1)
rgb_bits = parse_exp("./work_rgb_drv/rgb_drv.exp")
new_bits = []
for set_bit in rgb_bits:
if not (set_bit in known_bits):
new_bits.append(set_bit)
if len(new_bits) == 0:
sys.stderr.write('ERROR: no new bits set when setting config bit ' + fuzz_bit + '\n')
sys.exit(1)
if len(new_bits) > 1:
sys.stderr.write('ERROR: multiple new bits set when setting config bit ' + fuzz_bit + '\n')
for bit in new_bits:
sys.stderr.write('\t' + bit_to_str(bit) + '\n')
if not show_all_bits:
sys.exit(1)
if len(new_bits) == 1:
known_bits.append(new_bits[0])
if fuzz_bit == "RGB0_CURRENT_0":
print(("\"RGB_DRV_EN\":").ljust(24) + bit_to_str(rgb_drv_en_bit[device]) + ",")
dat.write(("\"RGB_DRV_EN\":").ljust(24) + bit_to_str(rgb_drv_en_bit[device]) + ",\n")
print(("\"LED_DRV_CUR_EN\":").ljust(24) + bit_to_str(led_drv_cur_en_bit[device]) + ",")
dat.write(("\"LED_DRV_CUR_EN\":").ljust(24) + bit_to_str(led_drv_cur_en_bit[device]) + ",\n")
print(("\"" + fuzz_bit + "\":").ljust(24) + bit_to_str(new_bits[0]) + ",")
dat.write(("\"" + fuzz_bit + "\":").ljust(24) + bit_to_str(new_bits[0]) + ",\n")
do_fuzz()
20 changes: 20 additions & 0 deletions icefuzz/tests/rgb_drv_cbit/rgb_drv_data_u4k.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
"RGB_DRV_EN": (0, 18, "CBIT_5"),
"LED_DRV_CUR_EN": (25, 19, "CBIT_5"),
"RGB0_CURRENT_0": (0, 18, "CBIT_6"),
"RGB0_CURRENT_1": (0, 18, "CBIT_7"),
"RGB0_CURRENT_2": (0, 19, "CBIT_0"),
"RGB0_CURRENT_3": (0, 19, "CBIT_1"),
"RGB0_CURRENT_4": (0, 19, "CBIT_2"),
"RGB0_CURRENT_5": (0, 19, "CBIT_3"),
"RGB1_CURRENT_0": (0, 19, "CBIT_4"),
"RGB1_CURRENT_1": (0, 19, "CBIT_5"),
"RGB1_CURRENT_2": (0, 19, "CBIT_6"),
"RGB1_CURRENT_3": (0, 19, "CBIT_7"),
"RGB1_CURRENT_4": (0, 20, "CBIT_0"),
"RGB1_CURRENT_5": (0, 20, "CBIT_1"),
"RGB2_CURRENT_0": (0, 20, "CBIT_2"),
"RGB2_CURRENT_1": (0, 20, "CBIT_3"),
"RGB2_CURRENT_2": (0, 20, "CBIT_4"),
"RGB2_CURRENT_3": (0, 20, "CBIT_5"),
"RGB2_CURRENT_4": (0, 20, "CBIT_6"),
"RGB2_CURRENT_5": (0, 20, "CBIT_7"),
8 changes: 8 additions & 0 deletions icefuzz/tests/sb_rgb_drv.pcf
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
set_io r_led 39
set_io g_led 40
set_io b_led 41
set_io r_in 25
set_io g_in 26
set_io b_in 27
set_io en 28
set_io rgbleden 31
36 changes: 36 additions & 0 deletions icefuzz/tests/sb_rgb_drv.v
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
module top
(
input en,
input rgbleden,
input r_in,
input g_in,
input b_in,
output r_led,
output g_led,
output b_led);

wire ledpu;

SB_LED_DRV_CUR
LED_DRV_CUR(.EN(en),
.LEDPU(ledpu));

wire rgbpu;

SB_RGB_DRV
RGB_DRV(.RGBLEDEN(rgbleden),
.RGBPU(rgbpu),
.RGB0PWM(r_in),
.RGB1PWM(g_in),
.RGB2PWM(b_in),
.RGB0(r_led),
.RGB1(g_led),
.RGB2(b_led));

defparam RGB_DRV.RGB0_CURRENT = "0b000011";
defparam RGB_DRV.RGB1_CURRENT = "0b001111";
defparam RGB_DRV.RGB2_CURRENT = "0b111111";

assign rgbpu = ledpu;

endmodule
Loading

0 comments on commit 56978cd

Please sign in to comment.