21
21
_program_json_to_flatbuffer ,
22
22
)
23
23
24
+ from executorch .exir ._serialize .padding import aligned_size , pad_to , padding_required
25
+
24
26
from executorch .exir .schema import (
25
27
BackendDelegateDataReference ,
26
28
BackendDelegateInlineData ,
@@ -50,19 +52,6 @@ def _json_to_program(program_json: bytes) -> Program:
50
52
return _json_to_dataclass (json .loads (program_json ), cls = Program )
51
53
52
54
53
- def _padding_required (offset : int , alignment : int ) -> int :
54
- """Returns the padding required to align `offset` to `alignment`."""
55
- remainder : int = offset % alignment
56
- if remainder != 0 :
57
- return alignment - remainder
58
- return 0
59
-
60
-
61
- def _aligned_size (input_size : int , alignment : int ) -> int :
62
- """Returns input_size padded up to the next whole multiple of alignment."""
63
- return input_size + _padding_required (input_size , alignment )
64
-
65
-
66
55
def _insert_flatbuffer_header (
67
56
flatbuffer_data : bytes , magic_regex : str , header_data : bytes
68
57
) -> bytes :
@@ -211,25 +200,6 @@ def to_bytes(self) -> bytes:
211
200
return data
212
201
213
202
214
- def _pad_to (data : bytes , length : int ) -> bytes :
215
- """Returns the input followed by enough zero bytes to become the requested length.
216
-
217
- Args:
218
- data: The data to pad.
219
- length: The length of the returned data.
220
- Returns:
221
- The padded data.
222
- Raises:
223
- ValueError: If the requested length is less than the input length.
224
- """
225
- if length < len (data ):
226
- raise ValueError (f"Data length { len (data )} > padded length { length } " )
227
- if length > len (data ):
228
- data = data + b"\x00 " * (length - len (data ))
229
- assert len (data ) == length
230
- return data
231
-
232
-
233
203
def _get_extended_header (program_data : bytes ) -> Optional [_ExtendedHeader ]:
234
204
"""Returns the extended header of the program data, if present and valid."""
235
205
try :
@@ -330,7 +300,7 @@ def _extract_constant_segment(
330
300
constant_segment_data .append (buffer .storage )
331
301
buffer_length = len (buffer .storage )
332
302
pad_length = (
333
- _padding_required (buffer_length , tensor_alignment )
303
+ padding_required (buffer_length , tensor_alignment )
334
304
if tensor_alignment is not None
335
305
else 0
336
306
)
@@ -432,11 +402,11 @@ def serialize_pte_binary(
432
402
)
433
403
program .segments .append (
434
404
DataSegment (
435
- offset = _aligned_size (prev_end , segment_alignment ), size = len (data )
405
+ offset = aligned_size (prev_end , segment_alignment ), size = len (data )
436
406
)
437
407
)
438
408
# Add to aggregate segments cord with padding.
439
- padding_length = _padding_required (len (segments_data ), segment_alignment )
409
+ padding_length = padding_required (len (segments_data ), segment_alignment )
440
410
if padding_length > 0 :
441
411
segments_data .append (b"\x00 " * padding_length )
442
412
segments_data .append (data )
@@ -454,15 +424,15 @@ def serialize_pte_binary(
454
424
455
425
# Size of the header to insert. Its size is padded to the largest
456
426
# force_align value present in the schema.
457
- padded_header_length : int = _aligned_size (
427
+ padded_header_length : int = aligned_size (
458
428
input_size = _ExtendedHeader .EXPECTED_LENGTH ,
459
429
alignment = result .max_alignment ,
460
430
)
461
431
# Size of the program with the header inserted.
462
432
program_size : int = padded_header_length + len (result .data )
463
433
# Offset to the first segment, or zero if there are no segments.
464
434
segment_base_offset : int = (
465
- _aligned_size (input_size = program_size , alignment = segment_alignment )
435
+ aligned_size (input_size = program_size , alignment = segment_alignment )
466
436
if len (segments_data ) > 0
467
437
else 0
468
438
)
@@ -471,7 +441,7 @@ def serialize_pte_binary(
471
441
header_data : bytes = _ExtendedHeader (
472
442
program_size = program_size , segment_base_offset = segment_base_offset
473
443
).to_bytes ()
474
- header_data = _pad_to (header_data , padded_header_length )
444
+ header_data = pad_to (header_data , padded_header_length )
475
445
476
446
# Insert the header into the flatbuffer data.
477
447
program_data : bytes = _insert_flatbuffer_header (
@@ -496,7 +466,7 @@ def serialize_pte_binary(
496
466
# - segments data (optional); aligned to segment_alignment.
497
467
pte_data = Cord (program_data )
498
468
if len (segments_data ) > 0 :
499
- padding_length = _padding_required (len (pte_data ), segment_alignment )
469
+ padding_length = padding_required (len (pte_data ), segment_alignment )
500
470
pte_data .append (b"\x00 " * padding_length )
501
471
# The first segment after program data should start at the segment base offset.
502
472
assert (
0 commit comments