Changeset 305 for proto/parabix2


Ignore:
Timestamp:
Sep 16, 2009, 3:36:52 PM (10 years ago)
Author:
eamiri
Message:

Variable declarations are now generated

File:
1 edited

Legend:

Unmodified
Added
Removed
  • proto/parabix2/Compiler/bitstream_compiler.py

    r301 r305  
    5656        self.generated_code = []
    5757        self.common_expression_map = {}
     58        self.new_vars = []
     59        self.carry_counter = 0
     60        self.brw_counter = 0
     61        self.vars = {}
    5862        for sym in predeclared: self.common_expression_map[sym] = sym
     63
    5964    def add_stmt(self, varname, expr):
    6065        self.common_expression_map[expr.show()] = varname
    6166        self.generated_code.append(bitexpr.BitAssign(varname, expr))
     67        if expr.op == Add:
     68                self.carry_counter += 1
     69        if expr.op == Sub:
     70                self.brw_counter += 1
     71
    6272    def expr_string_to_variable(self, expr_string):
    6373        if self.common_expression_map.has_key(expr_string.show()):
     
    6878            self.add_stmt(sym, expr_string)
    6979            return sym
     80
     81    def gen_declarations(self):
     82        s = ''
     83        for i in self.vars['int']:
     84                s+="int %s=0;\n"%i
     85       
     86        for i in self.vars['bitblock']:
     87                s+="BitBlock %s;\n"%i
     88               
     89        for i in self.vars['array']:
     90                s+="BitBlock %s[%i];\n"%(i, self.vars['array'][i]+1)
     91       
     92        for i in self.vars['struct']:
     93                s+="struct __%s__{\n"%i
     94                for j in self.vars['struct'][i]:
     95                        s+= "\tBitBlock %s;\n"%j
     96                s+="};\n"
     97                s+="struct __%s__ %s;\n"%(i,i)
     98
     99        return s
     100
     101    def parse_var(self, var):
     102        index=var.find('.')
     103        if index >= 0:
     104                return ('struct', var[0:index], var[index+1:])
     105               
     106        index = var.find('[')
     107        if index >= 0:
     108                return ('array', var[0:index], var[index+1:-1])
     109       
     110        return ('bitblock', var, None)
     111
     112    def extract_vars(self):
     113        ints = set([])
     114        bitblocks = set([])
     115        arrays = {}
     116        structs = {}
     117
     118        for stmt in self.generated_code:
     119                all_vars = [stmt.LHS]+stmt.RHS.vars
     120               
     121                if stmt.RHS.op == Add or stmt.RHS.op == Sub:
     122                        ints.add(all_vars.pop())
     123               
     124                for var in all_vars:
     125                        (var_type, name, extra) = self.parse_var(var)
     126                        #print
     127                        #print var, var_type, name
     128               
     129                        if (var_type == "bitblock"):
     130                                bitblocks.add(name)
     131               
     132                        if var_type == "array":
     133                                if not name in arrays:
     134                                        arrays[name]= extra
     135                                else:
     136                                        arrays[name] = max(arrays[name], extra)
     137                       
     138                        if var_type == "struct":
     139                                if not name in structs:
     140                                        structs[name] = set([extra])
     141                                else:
     142                                        structs[name].add(extra)
     143                                print structs[name]
     144
     145        self.vars={'int':ints, 'bitblock': bitblocks, 'array': arrays, 'struct': structs}
     146
     147
    70148    def showcode(self, line_no = False):
    71         s = ''
     149        self.extract_vars()
     150        s = self.gen_declarations()
    72151        for index, stmt in enumerate(self.generated_code):
    73152                if line_no:
     
    122201       e1 = genobj.expr_string_to_variable(expr2simd(genobj, expr.operand1))
    123202       e2 = genobj.expr_string_to_variable(expr2simd(genobj, expr.operand2))
    124        return simple_op(Add, e1, e2)
     203       carry = "carry%i"%genobj.carry_counter
     204       return simple_op(Add, e1, e2, carry)
    125205    elif isinstance(expr, bitexpr.Sub):
    126206       e1 = genobj.expr_string_to_variable(expr2simd(genobj, expr.operand1))
    127207       e2 = genobj.expr_string_to_variable(expr2simd(genobj, expr.operand2))
    128        return simple_op(Sub, e1, e2)
     208       brw = "brw%i"%genobj.brw_counter
     209       return simple_op(Sub, e1, e2, brw)
    129210
    130211def pybit_codegen(cgo, stmts):
     
    153234
    154235def make_SSA(code, st):
     236        new_vars = []
    155237        total_lines = len(code)
    156238        for var in st:
     
    163245                for current, next in pairs(st[var][0])[1:-1]:
    164246                        code[current].LHS = "%s_%i"%(var, current)
     247                        new_vars.append("%s_%i"%(var, current))
    165248                        uline = st[var][1][use_index]
    166249                        while uline <= next and uline < total_lines:
     
    169252                                use_index += 1
    170253                                uline = st[var][1][use_index]
     254       
     255        return new_vars
    171256
    172257if __name__ == '__main__':
     
    204289        #print c.showcode(True)
    205290        code = c.generated_code
    206         make_SSA(code, gen_sym_table(code))
     291        c.new_vars = make_SSA(code, gen_sym_table(code))
    207292        print c.showcode(True)
Note: See TracChangeset for help on using the changeset viewer.