From 56978cde58b1d8b5d3becc692ca2b4d72094b2b8 Mon Sep 17 00:00:00 2001 From: Simon Schubert <2@0x2c.org> Date: Mon, 10 Jun 2019 11:47:31 +0200 Subject: add RGB_DRV/LED_DRV_CUR for u4k --- icefuzz/tests/rgb_drv_cbit/.gitignore | 1 + icefuzz/tests/rgb_drv_cbit/fuzz_rgb_drv_cbit.py | 181 ++++++++++++++++++++++++ icefuzz/tests/rgb_drv_cbit/rgb_drv_data_u4k.txt | 20 +++ icefuzz/tests/sb_rgb_drv.pcf | 8 ++ icefuzz/tests/sb_rgb_drv.v | 36 +++++ 5 files changed, 246 insertions(+) create mode 100644 icefuzz/tests/rgb_drv_cbit/.gitignore create mode 100755 icefuzz/tests/rgb_drv_cbit/fuzz_rgb_drv_cbit.py create mode 100644 icefuzz/tests/rgb_drv_cbit/rgb_drv_data_u4k.txt create mode 100644 icefuzz/tests/sb_rgb_drv.pcf create mode 100644 icefuzz/tests/sb_rgb_drv.v (limited to 'icefuzz/tests') diff --git a/icefuzz/tests/rgb_drv_cbit/.gitignore b/icefuzz/tests/rgb_drv_cbit/.gitignore new file mode 100644 index 0000000..a1bf670 --- /dev/null +++ b/icefuzz/tests/rgb_drv_cbit/.gitignore @@ -0,0 +1 @@ +work_rgb_drv/ diff --git a/icefuzz/tests/rgb_drv_cbit/fuzz_rgb_drv_cbit.py b/icefuzz/tests/rgb_drv_cbit/fuzz_rgb_drv_cbit.py new file mode 100755 index 0000000..57f69b4 --- /dev/null +++ b/icefuzz/tests/rgb_drv_cbit/fuzz_rgb_drv_cbit.py @@ -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() diff --git a/icefuzz/tests/rgb_drv_cbit/rgb_drv_data_u4k.txt b/icefuzz/tests/rgb_drv_cbit/rgb_drv_data_u4k.txt new file mode 100644 index 0000000..54f4aa0 --- /dev/null +++ b/icefuzz/tests/rgb_drv_cbit/rgb_drv_data_u4k.txt @@ -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"), diff --git a/icefuzz/tests/sb_rgb_drv.pcf b/icefuzz/tests/sb_rgb_drv.pcf new file mode 100644 index 0000000..993782a --- /dev/null +++ b/icefuzz/tests/sb_rgb_drv.pcf @@ -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 diff --git a/icefuzz/tests/sb_rgb_drv.v b/icefuzz/tests/sb_rgb_drv.v new file mode 100644 index 0000000..77533d8 --- /dev/null +++ b/icefuzz/tests/sb_rgb_drv.v @@ -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 -- cgit v1.2.3