def generate_stateless_alu(self, alu_name, potential_operands): # Grab the stateless alu file name by using input_stream = FileStream(self.stateless_alu_filename_) lexer = aluLexer(input_stream) stream = CommonTokenStream(lexer) parser = aluParser(stream) tree = parser.alu() sketch_stateless_alu_visitor = \ SketchStatelessAluVisitor( self.stateless_alu_filename_, self.sketch_name_ + '_' + alu_name, potential_operands, self.generate_mux, self.constant_arr_size_) sketch_stateless_alu_visitor.visit(tree) self.add_holes(sketch_stateless_alu_visitor.global_holes) self.stateless_alu_hole_arguments_ = [ x for x in sorted( sketch_stateless_alu_visitor.stateless_alu_args )] self.num_stateless_muxes_ = \ len(sketch_stateless_alu_visitor.packet_fields) return (sketch_stateless_alu_visitor.helper_function_strings + sketch_stateless_alu_visitor.main_function)
def generate_stateful_alu(self, alu_name): input_stream = FileStream(self.stateful_alu_filename_) lexer = aluLexer(input_stream) stream = CommonTokenStream(lexer) parser = aluParser(stream) tree = parser.alu() sketch_stateful_alu_visitor = SketchStatefulAluVisitor( self.sketch_name_ + '_' + alu_name, self.constant_arr_size_) sketch_stateful_alu_visitor.visit(tree) self.add_holes(sketch_stateful_alu_visitor.global_holes) self.stateful_alu_hole_arguments_ = [ x for x in sorted(sketch_stateful_alu_visitor.alu_args) ] self.num_operands_to_stateful_alu_ = len( sketch_stateful_alu_visitor.packet_fields) self.num_state_slots_ = len(sketch_stateful_alu_visitor.state_vars) return (sketch_stateful_alu_visitor.helper_function_strings + sketch_stateful_alu_visitor.main_function)
def generate_stateful_alu(self, alu_name): input_stream = FileStream(self.stateful_alu_filename_) lexer = aluLexer(input_stream) stream = CommonTokenStream(lexer) parser = aluParser(stream) tree = parser.alu() operand0 = 'ipv4.pkt_' + str(self.hole_assignments_.pop( self.sketch_name_ + '_' + alu_name + '_operand_mux_0_ctrl')) operand1 = 'ipv4.pkt_' + str(self.hole_assignments_.pop( self.sketch_name_ + '_' + alu_name + '_operand_mux_1_ctrl')) tofino_stateful_alu_visitor = TofinoStatefulAluVisitor( self.sketch_name_ + '_' + alu_name, self.constant_arr_, self.hole_assignments_, operand0, operand1) tofino_stateful_alu_visitor.visit(tree) # Ensure changes to hole_assignments made by TofinoStatefulAluVisitor # are reflected back in self.hole_assignments_ self.hole_assignments_ = tofino_stateful_alu_visitor.hole_assignments return tofino_stateful_alu_visitor.template_args