Пример #1
0
def read_fd(fname):
  func_pat = "([A-Za-z][_A-Za-z00-9]+)\((.*)\)\((.*)\)"
  func_table = None
  bias = 0
  private = True
  # parse file
  f = open(fname, "r")
  for line in f:
    l = line.strip()
    if len(l) > 1 and l[0] != '*':
        # a command
        if l[0] == '#' and l[1] == '#':
          cmdline = l[2:]
          cmda = cmdline.split(" ")
          cmd = cmda[0]
          if cmd == "base":
            base = cmda[1]
            func_table = FuncTable(base)
          elif cmd == "bias":
            bias = int(cmda[1])
          elif cmd == "private":
            private = True
          elif cmd == "public":
            private = False
          elif cmd == "end":
            break
          else:
            print "Invalid command:",cmda
            return None
        # a function
        else:
          m = re.match(func_pat, l)
          if m == None:
            raise IOError("Invalid FD Format")
          else:
            name = m.group(1)
            # create a function definition
            func_def = FuncDef(name, bias, private)
            if func_table != None:
              func_table.add_func(func_def)
            # check args
            args = m.group(2)
            regs = m.group(3)
            arg = args.replace(',','/').split('/')
            reg = regs.replace(',','/').split('/')
            if len(arg) != len(reg):
              # hack for double reg args found in mathieeedoub* libs
              if len(arg) * 2 == len(reg):
                arg_hi = map(lambda x: x + "_hi", arg)
                arg_lo = map(lambda x: x + "_lo", arg)
                arg = [x for pair in zip(arg_hi, arg_lo) for x in pair]
              else:
                raise IOError("Reg and Arg name mismatch in FD File")
            if arg[0] != '':
              num_args = len(arg)
              for i in range(num_args):
                func_def.add_arg(arg[i],reg[i])
          bias += 6
  f.close()
  return func_table
Пример #2
0
 def add_call(self, name, bias, arg, reg, is_std=False):
     if len(arg) != len(reg):
         raise IOError("Reg and Arg name mismatch in function definition")
     else:
         func_def = FuncDef(name, bias, False, is_std)
         self.add_func(func_def)
         if arg and len(arg) > 0:
             num_args = len(arg)
             for i in range(num_args):
                 func_def.add_arg(arg[i], reg[i])
Пример #3
0
 def add_call(self,name,bias,arg,reg,is_std=False):
   if len(arg) != len(reg):
     raise IOError("Reg and Arg name mismatch in function definition")
   else:
     func_def = FuncDef(name, bias, False, is_std)
     self.add_func(func_def)
     if arg and len(arg) > 0:
       num_args = len(arg)
       for i in range(num_args):
         func_def.add_arg(arg[i],reg[i])
Пример #4
0
def read_fd(fname):
    func_pat = "([A-Za-z][_A-Za-z00-9]+)\((.*)\)\((.*)\)"
    func_table = None
    bias = 0
    private = True
    # parse file
    f = open(fname, "r")
    for line in f:
        l = line.strip()
        if len(l) > 1 and l[0] != '*':
            # a command
            if l[0] == '#' and l[1] == '#':
                cmdline = l[2:]
                cmda = cmdline.split(" ")
                cmd = cmda[0]
                if cmd == "base":
                    base = cmda[1]
                    func_table = FuncTable(base)
                elif cmd == "bias":
                    bias = int(cmda[1])
                elif cmd == "private":
                    private = True
                elif cmd == "public":
                    private = False
                elif cmd == "end":
                    break
                else:
                    print "Invalid command:", cmda
                    return None
            # a function
            else:
                m = re.match(func_pat, l)
                if m == None:
                    raise IOError("Invalid FD Format")
                else:
                    name = m.group(1)
                    # create a function definition
                    func_def = FuncDef(name, bias, private)
                    if func_table != None:
                        func_table.add_func(func_def)
                    # check args
                    args = m.group(2)
                    regs = m.group(3)
                    arg = args.replace(',', '/').split('/')
                    reg = regs.replace(',', '/').split('/')
                    if len(arg) != len(reg):
                        raise IOError("Reg and Arg name mismatch in FD File")
                    else:
                        if arg[0] != '':
                            num_args = len(arg)
                            for i in range(num_args):
                                func_def.add_arg(arg[i], reg[i])
                bias += 6
    f.close()
    return func_table
Пример #5
0
def read_fd(fname):
    func_pat = "([A-Za-z][_A-Za-z00-9]+)\((.*)\)\((.*)\)"
    func_table = None
    bias = 0
    private = True
    # parse file
    f = open(fname, "r")
    for line in f:
        l = line.strip()
        if len(l) > 1 and l[0] != '*':
            # a command
            if l[0] == '#' and l[1] == '#':
                cmdline = l[2:]
                cmda = cmdline.split(" ")
                cmd = cmda[0]
                if cmd == "base":
                    base = cmda[1]
                    func_table = FuncTable(base)
                elif cmd == "bias":
                    bias = int(cmda[1])
                elif cmd == "private":
                    private = True
                elif cmd == "public":
                    private = False
                elif cmd == "end":
                    break
                else:
                    print "Invalid command:", cmda
                    return None
            # a function
            else:
                m = re.match(func_pat, l)
                if m == None:
                    raise IOError("Invalid FD Format")
                else:
                    name = m.group(1)
                    # create a function definition
                    func_def = FuncDef(name, bias, private)
                    if func_table != None:
                        func_table.add_func(func_def)
                    # check args
                    args = m.group(2)
                    regs = m.group(3)
                    arg = args.replace(',', '/').split('/')
                    reg = regs.replace(',', '/').split('/')
                    if len(arg) != len(reg):
                        # hack for double reg args found in mathieeedoub* libs
                        if len(arg) * 2 == len(reg):
                            arg_hi = map(lambda x: x + "_hi", arg)
                            arg_lo = map(lambda x: x + "_lo", arg)
                            arg = [
                                x for pair in zip(arg_hi, arg_lo) for x in pair
                            ]
                        elif name == "IEEEDPSincos":  # selco ugly hack for IEEEDPSincos() (Parameters is 1 + 2 registers)
                            arg = ["fp2", "parm_hi", "parm_lo"]
                        else:
                            raise IOError(
                                "Reg and Arg name mismatch in FD File")
                    if arg[0] != '':
                        num_args = len(arg)
                        for i in range(num_args):
                            func_def.add_arg(arg[i], reg[i])
                bias += 6
    f.close()
    return func_table