def processAssignment(self, var, operand, rhs):
subsystem = self.currentSubsystem()
scope = self.currentScope()
#error if this is a diffvar
if var in subsystem.diffvars:
raise XXXSyntaxError("Can't assign to differential variable '%s'." % var)
if var in subsystem.inputs:
raise XXXSyntaxError("Can't assign to shared variable '%s'." % var)
if var == self.timeVar:
raise XXXSyntaxError("Can't assign to integration variable '%s'." % var)
if var in subsystem.accums:
if operand != '+=' and operand != '-=':
raise XXXSyntaxError("Can only += or -= accumulation variable '%s'."%var)
if var not in subsystem.outputs and not scope.hasSymbol(var):
(exists, dontcare) = self.searchForJunction(var)
if exists:
raise XXXSyntaxError("Can't assign to shared variable '%s'." % var)
if operand != '=':
if not scope.hasSymbol(var):
if var in subsystem.accums:
lhs = textToAST("0",ASTUnit(scope.getUnit(var),False))
else:
raise XXXSyntaxError("'%s' used before assignment."%var)
else:
lhs = self.readAccessVar(var)
if operand == '+=' or operand == '-=':
if operand == '-=':
rhs = AST(sympy.Mul(sympy.Integer(-1),rhs.sympy), rhs.astUnit)
rhs = AST(sympy.Add(lhs.sympy,rhs.sympy), self.checkExactUnits(lhs.astUnit,rhs.astUnit))
elif operand == '*=' or operand == '/=':
if operand == "/=":
rhs = AST(sympy.Pow(rhs.sympy,sympy.Integer(-1)), rhs.astUnit ** -1)
rhs = AST(sympy.Mul(lhs.sympy,rhs.sympy), lhs.astUnit*rhs.astUnit)
elif operand == '^=':
rhs = self.powerProcess(lhs, rhs)
else:
assert(0)
#Time to do final unit checks
if scope.hasUnit(var):
#print var
#print scope.getUnit(var)
#print rhs
rhs = self.checkExplicitCast(scope.getUnit(var), rhs)
#ok, we're ready to do the assignment!
if var in subsystem.frozen:
XXXSyntaxError('"%s" cannot be assigned once it has been read.' % var)
symbol = Symbol(var)
subsystem.ssa[symbol] = rhs
scope.addInstruction(symbol)
scope.setSymbol(var, symbol)
#parameter checking code.
#FIXME
nameDepend = set([symbol.name for symbol in rhs.dependencies()])
newlyReadParams = (set(subsystem.attributeMap.keys()) & nameDepend) - subsystem.frozen
newlyReadParams -= set([var])
subsystem.frozen |= newlyReadParams
评论列表
文章目录