Ignore:
Timestamp:
Feb 1, 2010, 5:16:10 PM (10 years ago)
Author:
eamiri
Message:

arrays indexed by string are supported

File:
1 edited

Legend:

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

    r349 r352  
    138138                else: raise PyBitError("Illegal attribute %s\n" % ast.dump(ast_expr))
    139139        elif isinstance(ast_expr, ast.Subscript):
    140                 if isinstance(ast_expr.value, ast.Name) and isinstance(ast_expr.slice, ast.Index):
     140                if isinstance(ast_expr.value, ast.Name) and isinstance(ast_expr.slice.value, ast.Num):
    141141                        return bitexpr.Var("%s[%s]" % (ast_expr.value.id, translate_index(ast_expr.slice.value)))
     142                elif isinstance(ast_expr.value, ast.Name) and isinstance(ast_expr.slice.value, ast.Str):
     143                        return bitexpr.Var("%s.%s" % (ast_expr.value.id, translate_index(ast_expr.slice.value)))
    142144                else: raise PyBitError("Illegal array %s\n" % ast.dump(ast_expr))
    143145        elif isinstance(ast_expr, ast.UnaryOp):
     
    186188        elif isinstance(v, ast.Subscript):
    187189                if isinstance(v.value, ast.Name) and isinstance(v.slice, ast.Index):
    188                         return "%s[%s]" % (v.value.id, translate_index(v.slice.value))
     190                        if isinstance(v.slice.value, ast.Num):
     191                            return "%s[%s]" % (v.value.id, translate_index(v.slice.value))
     192                        elif isinstance(v.slice.value, ast.Str):
     193                            return "%s.%s" % (v.value.id, translate_index(v.slice.value))
     194                        else:
     195                           
     196                            assert(1==0)
    189197                else: raise PyBitError("Unknown operator %s\n" % ast.dump(v))
    190198
     
    364372    if index >= 0:
    365373        right_index = var.find(']')
    366         return ('array', var[0:index], var[index+1:right_index])       
     374        if var[index+1:right_index].isdigit():
     375           return ('array', var[0:index], var[index+1:right_index])     
     376        else:
     377            return ('struct', var[0:index], var[index+1:right_index])
    367378   
    368379    if var.startswith("carry") or var.startswith("Carry"):
     
    982993## *** Changes required here is the same as Pass 7
    983994#################################################################################################################
     995def get_effective_name(varname):
     996    dot = varname.find('.')
     997    bracket = varname.find('[')
     998    if dot > 0: return varname[:dot]
     999    if bracket > 0: return varname[:bracket]
     1000    return varname
     1001   
     1002   
    9841003def check_loc(loc, must_liv):
    985     if loc.LHS.varname in must_liv:
     1004    effective_name = get_effective_name(loc.LHS.varname)
     1005    if effective_name in must_liv:
    9861006        if isinstance(loc.RHS, bitexpr.Not):
    9871007            return set([loc.RHS.operand1.varname]), False
Note: See TracChangeset for help on using the changeset viewer.