MCPcopy Create free account
hub / github.com/NVIDIA/cuda-quantum / __deconstructAssignment

Method __deconstructAssignment

python/cudaq/kernel/ast_bridge.py:1433–1491  ·  view source on GitHub ↗
(self, target, value, process=None)

Source from the content-addressed store, hash-verified

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",

Callers 3

visit_AssignMethod · 0.95
bodyBuilderMethod · 0.95
filteredBodyBuilderMethod · 0.95

Calls 6

getIntegerTypeMethod · 0.95
getConstantIntMethod · 0.95
emitFatalErrorMethod · 0.95
getElementTypeMethod · 0.80
rangeFunction · 0.50
getMethod · 0.45

Tested by

no test coverage detected