Find implicit dependencies that need to be imported. Using primitives or types defined in librt submodules such as "librt.base64" requires dependency imports (e.g., capsule imports). Note that a module can depend on a librt module even if it doesn't explicitly import it, for exampl
(fn: FuncIR)
| 8 | |
| 9 | |
| 10 | def find_implicit_op_dependencies(fn: FuncIR) -> set[Dependency] | None: |
| 11 | """Find implicit dependencies that need to be imported. |
| 12 | |
| 13 | Using primitives or types defined in librt submodules such as "librt.base64" |
| 14 | requires dependency imports (e.g., capsule imports). |
| 15 | |
| 16 | Note that a module can depend on a librt module even if it doesn't explicitly |
| 17 | import it, for example via re-exported names or via return types of functions |
| 18 | defined in other modules. |
| 19 | """ |
| 20 | deps: set[Dependency] | None = None |
| 21 | # Check function signature types for dependencies |
| 22 | deps = find_type_dependencies(fn, deps) |
| 23 | # Check ops for dependencies |
| 24 | for block in fn.blocks: |
| 25 | for op in block.ops: |
| 26 | assert not isinstance(op, PrimitiveOp), "Lowered IR is expected" |
| 27 | if isinstance(op, CallC) and op.dependencies is not None: |
| 28 | for dep in op.dependencies: |
| 29 | if deps is None: |
| 30 | deps = set() |
| 31 | deps.add(dep) |
| 32 | deps = collect_type_deps(op.type, deps) |
| 33 | if isinstance(op, Assign): |
| 34 | deps = collect_type_deps(op.dest.type, deps) |
| 35 | return deps |
| 36 | |
| 37 | |
| 38 | def find_type_dependencies(fn: FuncIR, deps: set[Dependency] | None) -> set[Dependency] | None: |
searching dependent graphs…