def __get_nodes__()

in preprocess/asm_mips.py [0:0]


  def __get_nodes__(self, operand, is_tgt):
    # parsing operands
    name = 'tgt' if is_tgt else 'src'

    # First case: simple register value = non-memory operand
    if '('  not in operand and ')' not in operand:
      if isinstance(operand, list):
        reg = operand[0]
      else:
        reg = operand
      reg_node = self.__add_node__(Node(name=reg,
                                        node_id=self.num_nodes,
                                        node_type='reg-'+name,
                                        ins_id=self.num_ins,
                                        is_var=True))

      self.__add_edge__(Edge(name='',
                             edge_type=self.edge_type_2_id['non-mem-reg'],
                             src=self.num_ins,
                             tgt=reg_node.id))

      # add data dependency edges
      if self.raw:
        if not is_tgt and reg_node.name in self.src_vnode:
            self.__add_edge__(Edge(name='',
                                  edge_type=self.edge_type_2_id['last-read'],
                                  src=reg_node.id,
                                  tgt=self.src_vnode[reg_node.name].id))
            reg_node.edges[self.edge_type_2_id['last-read']] = self.src_vnode[reg_node.name]
            self.__add_edge__(Edge(name='',
                                  edge_type=self.edge_type_2_id['last-read'],
                                  src=self.src_vnode[reg_node.name].id,
                                  tgt=reg_node.id))
            self.src_vnode[reg_node.name].edges[self.edge_type_2_id['last-read']] = reg_node
            self.src_vnode[reg_node.name] = reg_node
        elif not is_tgt:
            self.src_vnode[reg_node.name] = reg_node
        if is_tgt and reg_node.name in self.tgt_vnode:
            self.__add_edge__(Edge(name='',
                                  edge_type=self.edge_type_2_id['last-write'],
                                  src=reg_node.id,
                                  tgt=self.tgt_vnode[reg_node.name].id))
            reg_node.edges[self.edge_type_2_id['last-write']] = self.tgt_vnode[reg_node.name]
            self.__add_edge__(Edge(name='',
                                  edge_type=self.edge_type_2_id['last-write'],
                                  src=self.tgt_vnode[reg_node.name].id,
                                  tgt=reg_node.id))
            self.tgt_vnode[reg_node.name].edges[self.edge_type_2_id['last-write']] = reg_node
            self.tgt_vnode[reg_node.name] = reg_node
        elif is_tgt:
            self.tgt_vnode[reg_node.name] = reg_node
        if not is_tgt and reg_node.name in self.src_vnode:
            self.__add_edge__(Edge(name='',
                                  edge_type=self.edge_type_2_id['last-read'],
                                  src=reg_node.id,
                                  tgt=self.src_vnode[reg_node.name].id))
            reg_node.edges[self.edge_type_2_id['last-read']] = self.src_vnode[reg_node.name]
            self.__add_edge__(Edge(name='',
                                  edge_type=self.edge_type_2_id['last-read'],
                                  src=self.src_vnode[reg_node.name].id,
                                  tgt=reg_node.id))
            self.src_vnode[reg_node.name].edges[self.edge_type_2_id['last-read']] = reg_node
        elif not is_tgt:
            self.src_vnode[reg_node.name] = reg_node
        if is_tgt and reg_node.name in self.tgt_vnode:
            # pdb.set_trace()
            self.__add_edge__(Edge(name='',
                                  edge_type=self.edge_type_2_id['last-write'],
                                  src=reg_node.id,
                                  tgt=self.tgt_vnode[reg_node.name].id))
            reg_node.edges[self.edge_type_2_id['last-write']] = self.tgt_vnode[reg_node.name]
            self.__add_edge__(Edge(name='',
                                  edge_type=self.edge_type_2_id['last-write'],
                                  src=self.tgt_vnode[reg_node.name].id,
                                  tgt=reg_node.id))
            self.tgt_vnode[reg_node.name].edges[self.edge_type_2_id['last-write']] = reg_node
        elif is_tgt:
            self.tgt_vnode[reg_node.name] = reg_node


    # Second case: memory operation: src = load, tgt=store
    else:
      # getting offset if any
      # in the format offset(base)
      # base can be expanded to (start, index, stride)
      if operand[0] == '(':
        # no offset
        base = operand
      else:
        # with offset
        offset, base = operand.rsplit('(', 1)
        # add offset node
        offset_node = self.__add_node__(Node(name=offset,
                                             node_id=self.num_nodes,
                                             node_type='offset'+ name,
                                             ins_id=self.num_ins,
                                             is_var=True))
        # add edges between type 2 and 3 (offset)
        self.__add_edge__(Edge(name='',
                               edge_type=self.edge_type_2_id['mem-offset'],
                               src=self.num_ins,
                               tgt=offset_node.id))
        base = '(' + base

      if base[-1] != ')':
        base += ')'
      base = base[1:-1].split(',')

      # single base
      if len(base) == 1:
        base = base[0]
        base_node = self.__add_node__(Node(name=base,
                                           node_id=self.num_nodes,
                                           node_type='base'+name,
                                           ins_id=self.num_ins,
                                           is_var=True))
        self.__add_edge__(Edge(name='',
                               edge_type=self.edge_type_2_id['mem-base'],
                               src=self.num_ins,
                               tgt=base_node.id))
      # array indexing
      else:
        if len(base) == 2:
          base += ['1']
        assert (len(base) == 3), 'base operation incorrect!'
        new_types = ['base', 'idx-stride', 'start', 'index', 'stride']
        new_nodes = []

        # add pseudo nodes
        for i in range(2):
          new_node = self.__add_node__(Node(name='pseudo_'+new_types[i],
                                            node_id=self.num_nodes,
                                            node_type=new_types[i],
                                            ins_id=self.num_ins))
          new_nodes.append(new_node)

        # add new nodes
        for i in range(3):
          new_node = self.__add_node__(Node(name=base[i],
                                            node_id=self.num_nodes,
                                            node_type=new_types[i+2],
                                            ins_id=self.num_ins,
                                            is_var=True))
          new_nodes.append(new_node)

        # add new edges:
        self.__add_edge__(Edge(name='',
                               edge_type=self.edge_type_2_id['mem-index'],
                               src=new_nodes[1].id,
                               tgt=new_nodes[3].id))
        new_nodes[1].edges[self.edge_type_2_id['mem-index']] = new_nodes[3]
        self.__add_edge__(Edge(name='',
                               edge_type=self.edge_type_2_id['mem-stride'],
                               src=new_nodes[1].id,
                               tgt=new_nodes[4].id))
        new_nodes[1].edges[self.edge_type_2_id['mem-stride']] = new_nodes[4]
        self.__add_edge__(Edge(name='',
                               edge_type=self.edge_type_2_id['mem-start'],
                               src=self.num_ins,
                               tgt=new_nodes[2].id))
        self.__add_edge__(Edge(name='',
                               edge_type=self.edge_type_2_id['mem-index-stride'],
                               src=self.num_ins,
                               tgt=new_nodes[1].id))