(self, target, value, process=None)
| 1431 | loop.attributes.__setitem__('invariant', UnitAttr.get()) |
| 1432 | |
| 1433 | def __deconstructAssignment(self, target, value, process=None): |
| 1434 | if process is not None: |
| 1435 | target, value = process(target, value) |
| 1436 | if isinstance(target, ast.Name): |
| 1437 | if value is not None: |
| 1438 | self.symbolTable[target.id] = value |
| 1439 | elif isinstance(target, ast.Tuple): |
| 1440 | if (isinstance(value, ast.Tuple) or isinstance(value, ast.List)): |
| 1441 | nrArgs = len(value.elts) |
| 1442 | getItem = lambda idx: value.elts[idx] |
| 1443 | elif (isinstance(value, tuple) or isinstance(value, list)): |
| 1444 | nrArgs = len(value) |
| 1445 | getItem = lambda idx: value[idx] |
| 1446 | elif cc.StructType.isinstance(value.type): |
| 1447 | argTypes = cc.StructType.getTypes(value.type) |
| 1448 | nrArgs = len(argTypes) |
| 1449 | getItem = lambda idx: cc.ExtractValueOp( |
| 1450 | argTypes[idx], value, [], |
| 1451 | DenseI32ArrayAttr.get([idx], context=self.ctx)).result |
| 1452 | elif quake.StruqType.isinstance(value.type): |
| 1453 | argTypes = quake.StruqType.getTypes(value.type) |
| 1454 | nrArgs = len(argTypes) |
| 1455 | getItem = lambda idx: quake.GetMemberOp( |
| 1456 | argTypes[idx], value, |
| 1457 | IntegerAttr.get(self.getIntegerType(32), idx)).result |
| 1458 | elif cc.StdvecType.isinstance(value.type): |
| 1459 | # We will get a runtime error for out of bounds access |
| 1460 | eleTy = cc.StdvecType.getElementType(value.type) |
| 1461 | elePtrTy = cc.PointerType.get(eleTy) |
| 1462 | arrTy = cc.ArrayType.get(eleTy) |
| 1463 | ptrArrTy = cc.PointerType.get(arrTy) |
| 1464 | vecPtr = cc.StdvecDataOp(ptrArrTy, value).result |
| 1465 | attr = DenseI32ArrayAttr.get([kDynamicPtrIndex], |
| 1466 | context=self.ctx) |
| 1467 | nrArgs = len(target.elts) |
| 1468 | getItem = lambda idx: cc.LoadOp( |
| 1469 | cc.ComputePtrOp(elePtrTy, vecPtr, [ |
| 1470 | self.getConstantInt(idx) |
| 1471 | ], attr).result).result |
| 1472 | elif quake.VeqType.isinstance(value.type): |
| 1473 | # We will get a runtime error for out of bounds access |
| 1474 | nrArgs = len(target.elts) |
| 1475 | getItem = lambda idx: quake.ExtractRefOp( |
| 1476 | quake.RefType.get(), |
| 1477 | value, |
| 1478 | -1, |
| 1479 | index=self.getConstantInt(idx)).result |
| 1480 | else: |
| 1481 | nrArgs = 0 |
| 1482 | if nrArgs != len(target.elts): |
| 1483 | self.emitFatalError("shape mismatch in tuple deconstruction", |
| 1484 | self.currentNode) |
| 1485 | for i in range(nrArgs): |
| 1486 | self.__deconstructAssignment(target.elts[i], |
| 1487 | getItem(i), |
| 1488 | process=process) |
| 1489 | else: |
| 1490 | self.emitFatalError("unsupported target in tuple deconstruction", |
no test coverage detected