Пример #1
0
class ParAssignStmt(common.AssignStmt[FieldAccess, Expr], Stmt):
    """Parallel assignment.

    R.h.s. is evaluated for all points and the resulting field is assigned
    (GTScript parallel model).
    Scalar variables on the l.h.s. are not allowed,
    as the only scalar variables are read-only stencil parameters.
    """
    @validator("left")
    def no_horizontal_offset_in_assignment(cls, v: Expr) -> Expr:
        if v.offset.i != 0 or v.offset.j != 0:
            raise ValueError(
                "Lhs of assignment must not have a horizontal offset.")
        return v

    @root_validator(skip_on_failure=True)
    def no_write_and_read_with_offset_of_same_field(
            cls, values: RootValidatorValuesType) -> RootValidatorValuesType:
        if isinstance(values["left"], FieldAccess):
            offset_reads = (values["right"].iter_tree().if_isinstance(
                FieldAccess).filter(lambda acc: acc.offset.i != 0 or acc.offset
                                    .j != 0).getattr("name").to_set())
            if values["left"].name in offset_reads:
                raise ValueError("Self-assignment with offset is illegal.")

        return values

    _dtype_validation = common.assign_stmt_dtype_validation(strict=False)
Пример #2
0
class AssignStmt(common.AssignStmt[Union[ScalarAccess, FieldAccess], Expr], Stmt):
    @validator("left")
    def no_horizontal_offset_in_assignment(
        cls, v: Union[ScalarAccess, FieldAccess]
    ) -> Union[ScalarAccess, FieldAccess]:
        if isinstance(v, FieldAccess) and (v.offset.i != 0 or v.offset.j != 0):
            raise ValueError("Lhs of assignment must not have a horizontal offset.")
        return v

    _dtype_validation = common.assign_stmt_dtype_validation(strict=True)
Пример #3
0
class VectorAssign(common.AssignStmt[VectorLValue, Expr], Stmt):
    left: VectorLValue
    right: Expr
    mask: Optional[Expr] = None

    @validator("right")
    def right_is_field_kind(cls, right: Expr) -> Expr:
        if right.kind != common.ExprKind.FIELD:
            raise ValueError("right is not a common.ExprKind.FIELD")
        return right

    _dtype_validation = common.assign_stmt_dtype_validation(strict=True)
Пример #4
0
class AssignStmt(common.AssignStmt[Union[ScalarAccess, FieldAccess,
                                         IJCacheAccess, KCacheAccess], Expr],
                 Stmt):
    _dtype_validation = common.assign_stmt_dtype_validation(strict=True)
Пример #5
0
class AssignStmt(Stmt, common.AssignStmt[DummyExpr, Expr]):
    _dtype_validation = common.assign_stmt_dtype_validation(strict=True)