TNSM_Latency_Prediction / code / control / test_scripts / gen_cp_rules.py
gen_cp_rules.py
Raw
import statistics
import sys
import os
from glob import glob
import time


def gen_rules(type, rules, tables, matches, mask, kw, dir, filename):

    if type == "exact":
        if matches == 1:
            open(dir+"/"+filename, "w").close()
            with open(dir+"/"+filename, 'a') as f:
                for t in range (1, tables+1):
                    i = 0
                    counter = 0
                    f.write('\n\n')
                    while i < key_width[0]:
                        f.write('bfrt.switch.pipe.Ingress.t%d.add_with_set_output(field0=%d, port=2);' % (t, i))
                        i += 1
                        counter += 1
                        if counter == rules:
                            print("Forced END: For t=%d, entries=%d, i=%d" % (t, counter, i))
                            break;
                    if counter == key_width:
                        print("For t=%d, entries=%d, i=%d" % (t, counter, i))
                f.write('\n\n')
        elif matches == 2:
            open(dir+"/"+filename, "w").close()
            with open(dir+"/"+filename, 'a') as f:
                counter = 0
                for t in range (1, tables+1):
                    i = 0
                    j = 0
                    counter = 0
                    f.write('\n\n')
                    while i < key_width[0]:
                        while j < key_width[1]:
                            f.write('bfrt.switch.pipe.Ingress.t%d.add_with_set_output(custom1_field0=%d,custom2_field0=%d, port=2);' % (t, i, j))
                            j += 1
                            counter += 1
                            if counter == rules:
                                break;
                        if counter == rules:
                            print("Forced END: For t=%d, entries=%d, i=%d, j=%d" % (t, counter, i, j))
                            break;

                        i += 1
                        j = 0
                    print("For t=%d, entries=%d, i=%d, j=%d" % (t, counter, i, j))
                f.write('\n\n')
        elif matches == 3:
            open(dir+"/"+filename, "w").close()
            with open(dir+"/"+filename, 'a') as f:
                counter = 0
                for t in range (1, tables+1):
                    i = 0
                    j = 0
                    k = 0
                    counter = 0
                    f.write('\n\n')
                    while i < key_width[0]:
                        while j < key_width[1]:
                            while k < key_width[2]:
                                f.write('bfrt.switch.pipe.Ingress.t%d.add_with_set_output(custom1_field0=%d,custom2_field0=%d, custom3_field0=%d, port=2);' % (t, k, j, i))
                                k += 1
                                counter += 1
                                if counter == rules:
                                    break;
                            if counter == rules:
                                break;

                            j += 1
                            k = 0
                        
                        if counter == rules:
                            print("Forced END: For t=%d, entries=%d, k=%d, j=%d, i=%d" % (t, counter, k, j, i))
                            break;

                        i += 1
                        j = 0
                        k = 0
                    print("For t=%d, entries=%d, k=%d, j=%d, i=%d" % (t, counter, k, j, i))
                f.write('\n\n')
    else:
        print("Hi")
        if matches == 1:
            open(dir+"/"+filename, "w").close()
            with open(dir+"/rules.txt", 'a') as f:
                for t in range (1, tables+1):
                    counter = 0
                    base = 0
                    n = 2**(kw-mask)
                    f.write('\n\n')
                    while base < key_width[0]:
                        f.write('bfrt.switch.pipe.Ingress.t%d.add_with_set_output(field0=%d, field0_p_length=%d,port=2);' % (t, base, mask))
                        counter += 1
                        if counter == rules:
                            print("Forced END: For t=%d, entries=%d, base=%d" % (t, counter, base))
                            break;
                        base += n
                    
                    if base == key_width[0]:
                        print("For t=%d, entries=%d, i=%d" % (t, counter, base))
                f.write('\n\n')

if __name__ == "__main__":
    match_type = sys.argv[1]
    key_width = 2**int(sys.argv[2])[int(x) for x in sys.argv[2].split(":")]
    mask = int(sys.argv[3])
    num_rules = int(sys.argv[4])
    max_tables = int(sys.argv[5])
    matches = int(sys.argv[6])
    dir = sys.argv[7]
    filename = sys.argv[8]
    if not os.path.isdir(dir):
        print(problem)
    gen_rules(match_type, num_rules, max_tables, matches, mask, int(sys.argv[2]), dir, filename)