def __init__(self, name, hlir, isRouter, config):
        assert isinstance(hlir, HLIR)
        assert isinstance(isRouter, bool)
        assert isinstance(config, target.TargetConfig)

        self.hlir = hlir
        self.name = name
        self.uniqueNameCounter = 0
        self.config = config
        self.isRouter = isRouter
        self.reservedPrefix = "ebpf_"

        assert isinstance(config, target.TargetConfig)

        self.packetName = self.reservedPrefix + "packet"
        self.dropBit = self.reservedPrefix + "drop"
        self.license = "GPL"
        self.offsetVariableName = self.reservedPrefix + "packetOffsetInBits"
        self.zeroKeyName = self.reservedPrefix + "zero"
        self.arrayIndexType = self.config.uprefix + "32"
        # all array tables must be indexed with u32 values

        self.errorName = self.reservedPrefix + "error"
        self.functionName = self.reservedPrefix + "filter"
        self.egressPortName = "egress_port" # Hardwired in P4 definition

        self.typeFactory = typeFactory.EbpfTypeFactory(config)
        self.errorCodes = [
            "p4_pe_no_error",
            "p4_pe_index_out_of_bounds",
            "p4_pe_out_of_packet",
            "p4_pe_header_too_long",
            "p4_pe_header_too_short",
            "p4_pe_unhandled_select",
            "p4_pe_checksum"]

        self.actions = []
        self.conditionals = []
        self.tables = []
        self.headers = []   # header instances
        self.metadata = []  # metadata instances
        self.stacks = []    # header stack instances EbpfHeaderStack
        self.parsers = []   # all parsers
        self.deparser = None
        self.entryPoints = []  # control-flow entry points from parser
        self.counters = []
        self.entryPointLabels = {}  # maps p4_node from entryPoints
                                    # to labels in the C program
        self.egressEntry = None

        self.construct()

        self.headersStructTypeName = self.reservedPrefix + "headers_t"
        self.headerStructName = self.reservedPrefix + "headers"
        self.metadataStructTypeName = self.reservedPrefix + "metadata_t"
        self.metadataStructName = self.reservedPrefix + "metadata"
Representation of an EbpfProgram (in fact, 
dataset/ETHPy150Open iovisor/bcc/src/cc/frontends/p4/compiler/ebpfProgram.py/EbpfProgram.__init__