def build_funct_dbg3(): stmt = [] stmt.append(ast.Template("$display(\"(%%0d) \", $time, msg);")) ifstmt = apply_if_verbosity(3, stmt) ablock = apply_action_block(ifstmt) funct = ast.Function("dbg3", 'Action', 'Fmt msg', ablock) return funct
def build_write_function(self, tid, ksz, vsz): TMP1 = "matchtable_write_%s(key, data);" % (self.name) name = "matchtable_write" type = "Action" params = "Bit#(%s) id, Bit#(%s) key, Bit#(%s) data" % (tid, ksz, vsz) stmt = [] stmt.append(ast.Template(TMP1)) action_block = ast.ActionBlock(stmt) funct = ast.Function(name, type, params, stmt=[action_block]) return funct
def funct_compute_next_state(self, state): TMP1 = "DeparserState nextState = StateDeparseStart;" TMP2 = "return nextState;" stmt = [] stmt.append(ast.Template(TMP1)) stmt.append(ast.Template(TMP2)) fname = "compute_next_state" rtype = "DeparserState" params = "DeparserState state" funct = ast.Function(fname, rtype, params, stmt) return funct
def build_read_function(self, tid, ksz, vsz): TMP1 = "let v <- matchtable_read_%s(key);" % (self.name) TMP2 = "return v;" name = "matchtable_read" type = "ActionValue#(Bit#(%s))" % (vsz) params = "Bit#(%s) id, Bit#(%s) key" % (tid, ksz) stmt = [] stmt.append(ast.Template(TMP1)) stmt.append(ast.Template(TMP2)) action_block = ast.ActionValueBlock(stmt) funct = ast.Function(name, type, params, stmt=[action_block]) return funct
def build_funct_push_phv(self, phv): TMP1 = "MetadataT meta = defaultValue;" TMP2 = "meta.%(field)s = tagged Valid rg_tmp_%(field)s;" TMP3 = "meta_in_ff.enq(meta);" params = "ParserState ty" stmt = [] stmt.append(ast.Template(TMP1)) for _, p in phv: stmt.append(ast.Template(TMP2, {"field": p})) stmt.append(ast.Template(TMP3)) ablock = apply_action_block(stmt) funct = ast.Function("push_phv", 'Action', params, ablock) return funct
def build_funct_verbosity(): TMP1 = "Reg#(int) cf_verbosity <- mkConfigRegU;" stmt = [] stmt.append(ast.Template(TMP1)) rl_stmt = [] rl_stmt.append(ast.Template("action")) rl_stmt.append( ast.Template("if (cf_verbosity > fromInteger(level)) begin")) rl_stmt.append(ast.Template(" $display(\"(%%d) \", $time, msg);")) rl_stmt.append(ast.Template("end")) rl_stmt.append(ast.Template("endaction")) funct = ast.Function("dbprint", 'Action', 'Integer level, Fmt msg', rl_stmt) stmt.append(funct) return stmt
def build_funct(name, parameters, transition): ab_stmt = [] if len(parameters) == 0 or (len(parameters) == 1 and transition[0]['value'] == 'start'): for t in transition: _, _, _stmt = build_transition(name, t) ab_stmt += _stmt else: key_stmt = ast.Template("let v = {%s};" % (", ".join([p[1] for p in parameters]))) ab_stmt.append(key_stmt) for idx, t in enumerate(transition): _value, _mask, _stmt = build_transition(name, t) expr = "(v & %s) == %s" % (_mask, _value) if _mask != None else "v == %s" % (_value) if _value == 'start' or _value == 'default': ab_stmt.append(ast.Else(_stmt)) else: if idx == 0: ab_stmt.append(ast.If(expr, _stmt)) else: ab_stmt.append(ast.ElseIf(expr, _stmt)) stmt = apply_action_block(ab_stmt) params = ', '.join(["Bit#(%s) %s" % (p[0], p[1]) for p in parameters]) f = ast.Function("compute_next_state_%s"%(name), 'Action', params, stmt) return f