| 568 | |
| 569 | @compatibility(is_backward_compatible=False) |
| 570 | class ExecutorchProgram: |
| 571 | def __init__( |
| 572 | self, |
| 573 | exir_exported_program: ExirExportedProgram, |
| 574 | emit_stacktrace: bool, |
| 575 | extract_delegate_segments: bool, |
| 576 | segment_alignment: int, |
| 577 | constant_tensor_alignment: Optional[int] = None, |
| 578 | delegate_alignment: Optional[int] = None, |
| 579 | ) -> None: |
| 580 | if not exir_exported_program.after_to_edge_passes: |
| 581 | raise RuntimeError( |
| 582 | "Need to call prog.to_edge prior to constructing ExecutorchProgram." |
| 583 | ) |
| 584 | self.exported_program = exir_exported_program.exported_program |
| 585 | self._pte_data: Optional[Cord] = None |
| 586 | self._tensor_data: Optional[Dict[str, Cord]] = None |
| 587 | self._buffer: Optional[bytes] = None |
| 588 | self._emitter_output: Optional[EmitterOutput] = None |
| 589 | self._emit_stacktrace: bool = emit_stacktrace |
| 590 | self._extract_delegate_segments: bool = extract_delegate_segments |
| 591 | self._segment_alignment: int = segment_alignment |
| 592 | self._constant_tensor_alignment: Optional[int] = constant_tensor_alignment |
| 593 | self._delegate_alignment: Optional[int] = delegate_alignment |
| 594 | from executorch.extension.flat_tensor.serialize.serialize import ( |
| 595 | FlatTensorConfig, |
| 596 | FlatTensorSerializer, |
| 597 | ) |
| 598 | |
| 599 | self._data_serializer: DataSerializer = FlatTensorSerializer( |
| 600 | FlatTensorConfig(self._segment_alignment) |
| 601 | ) |
| 602 | |
| 603 | def _get_emitter_output(self) -> EmitterOutput: |
| 604 | if self._emitter_output is None: |
| 605 | self._emitter_output = emit_program( |
| 606 | self.exported_program, self._emit_stacktrace |
| 607 | ) |
| 608 | return self._emitter_output |
| 609 | |
| 610 | def _get_pte_data(self) -> Cord: |
| 611 | if self._pte_data is None: |
| 612 | self._pte_data, self._tensor_data = serialize_for_executorch( |
| 613 | self._get_emitter_output(), |
| 614 | ExecutorchBackendConfig( |
| 615 | extract_delegate_segments=self._extract_delegate_segments, |
| 616 | segment_alignment=self._segment_alignment, |
| 617 | constant_tensor_alignment=self._constant_tensor_alignment, |
| 618 | delegate_alignment=self._delegate_alignment, |
| 619 | ), |
| 620 | self._data_serializer, |
| 621 | ) |
| 622 | assert self._pte_data is not None |
| 623 | return self._pte_data |
| 624 | |
| 625 | @property |
| 626 | def buffer(self) -> bytes: |
| 627 | """Returns the serialized ExecuTorch binary as a byte string. |