Skip to content

Commit 9802253

Browse files
committed
Update on "[executorch][serialization] Refactor flatbuffer utils into separate file"
For usage in extension/flat_tensor/serialize. Differential Revision: [D66854756](https://our.internmc.facebook.com/intern/diff/D66854756/) [ghstack-poisoned]
2 parents 93f6f1d + 9472794 commit 9802253

File tree

2 files changed

+24
-26
lines changed

2 files changed

+24
-26
lines changed

exir/_serialize/_program.py

Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,10 @@
2222
)
2323

2424
from executorch.exir._serialize.utils import (
25-
_aligned_size,
26-
_HEADER_BYTEORDER,
27-
_pad_to,
28-
_padding_required,
25+
aligned_size,
26+
HEADER_BYTEORDER,
27+
pad_to,
28+
padding_required,
2929
)
3030

3131
from executorch.exir.schema import (
@@ -90,11 +90,11 @@ def _insert_flatbuffer_header(
9090
return flatbuffer_data
9191

9292
# We will need to adjust the root object offset after inserting the header.
93-
root_offset = int.from_bytes(flatbuffer_data[0:4], byteorder=_HEADER_BYTEORDER)
93+
root_offset = int.from_bytes(flatbuffer_data[0:4], byteorder=HEADER_BYTEORDER)
9494

9595
return (
9696
# New root offset.
97-
(root_offset + len(header_data)).to_bytes(4, byteorder=_HEADER_BYTEORDER)
97+
(root_offset + len(header_data)).to_bytes(4, byteorder=HEADER_BYTEORDER)
9898
# Existing magic bytes.
9999
+ flatbuffer_data[4:8]
100100
# Provided header + padding.
@@ -159,11 +159,9 @@ def from_bytes(data: bytes) -> "_ExtendedHeader":
159159

160160
return _ExtendedHeader(
161161
magic=data[0:4],
162-
length=int.from_bytes(data[4:8], byteorder=_HEADER_BYTEORDER),
163-
program_size=int.from_bytes(data[8:16], byteorder=_HEADER_BYTEORDER),
164-
segment_base_offset=int.from_bytes(
165-
data[16:24], byteorder=_HEADER_BYTEORDER
166-
),
162+
length=int.from_bytes(data[4:8], byteorder=HEADER_BYTEORDER),
163+
program_size=int.from_bytes(data[8:16], byteorder=HEADER_BYTEORDER),
164+
segment_base_offset=int.from_bytes(data[16:24], byteorder=HEADER_BYTEORDER),
167165
)
168166

169167
def is_valid(self) -> bool:
@@ -189,12 +187,12 @@ def to_bytes(self) -> bytes:
189187
# fields to this header in the future. Always use the proper size
190188
# (i.e., ignore self.length) since there's no reason to create an
191189
# invalid header.
192-
+ self.EXPECTED_LENGTH.to_bytes(4, byteorder=_HEADER_BYTEORDER)
190+
+ self.EXPECTED_LENGTH.to_bytes(4, byteorder=HEADER_BYTEORDER)
193191
# uint64_t: Size of the flatbuffer data, including this header.
194-
+ self.program_size.to_bytes(8, byteorder=_HEADER_BYTEORDER)
192+
+ self.program_size.to_bytes(8, byteorder=HEADER_BYTEORDER)
195193
# uint64_t: Offset to the start of the first segment, or zero if
196194
# there are no segments.
197-
+ self.segment_base_offset.to_bytes(8, byteorder=_HEADER_BYTEORDER)
195+
+ self.segment_base_offset.to_bytes(8, byteorder=HEADER_BYTEORDER)
198196
)
199197
return data
200198

@@ -299,7 +297,7 @@ def _extract_constant_segment(
299297
constant_segment_data.append(buffer.storage)
300298
buffer_length = len(buffer.storage)
301299
pad_length = (
302-
_padding_required(buffer_length, tensor_alignment)
300+
padding_required(buffer_length, tensor_alignment)
303301
if tensor_alignment is not None
304302
else 0
305303
)
@@ -401,11 +399,11 @@ def serialize_pte_binary(
401399
)
402400
program.segments.append(
403401
DataSegment(
404-
offset=_aligned_size(prev_end, segment_alignment), size=len(data)
402+
offset=aligned_size(prev_end, segment_alignment), size=len(data)
405403
)
406404
)
407405
# Add to aggregate segments cord with padding.
408-
padding_length = _padding_required(len(segments_data), segment_alignment)
406+
padding_length = padding_required(len(segments_data), segment_alignment)
409407
if padding_length > 0:
410408
segments_data.append(b"\x00" * padding_length)
411409
segments_data.append(data)
@@ -423,15 +421,15 @@ def serialize_pte_binary(
423421

424422
# Size of the header to insert. Its size is padded to the largest
425423
# force_align value present in the schema.
426-
padded_header_length: int = _aligned_size(
424+
padded_header_length: int = aligned_size(
427425
input_size=_ExtendedHeader.EXPECTED_LENGTH,
428426
alignment=result.max_alignment,
429427
)
430428
# Size of the program with the header inserted.
431429
program_size: int = padded_header_length + len(result.data)
432430
# Offset to the first segment, or zero if there are no segments.
433431
segment_base_offset: int = (
434-
_aligned_size(input_size=program_size, alignment=segment_alignment)
432+
aligned_size(input_size=program_size, alignment=segment_alignment)
435433
if len(segments_data) > 0
436434
else 0
437435
)
@@ -440,7 +438,7 @@ def serialize_pte_binary(
440438
header_data: bytes = _ExtendedHeader(
441439
program_size=program_size, segment_base_offset=segment_base_offset
442440
).to_bytes()
443-
header_data = _pad_to(header_data, padded_header_length)
441+
header_data = pad_to(header_data, padded_header_length)
444442

445443
# Insert the header into the flatbuffer data.
446444
program_data: bytes = _insert_flatbuffer_header(
@@ -465,7 +463,7 @@ def serialize_pte_binary(
465463
# - segments data (optional); aligned to segment_alignment.
466464
pte_data = Cord(program_data)
467465
if len(segments_data) > 0:
468-
padding_length = _padding_required(len(pte_data), segment_alignment)
466+
padding_length = padding_required(len(pte_data), segment_alignment)
469467
pte_data.append(b"\x00" * padding_length)
470468
# The first segment after program data should start at the segment base offset.
471469
assert (

exir/_serialize/utils.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@
77
# Byte order of numbers written to program headers. Always little-endian
88
# regardless of the host system, since all commonly-used modern CPUs are little
99
# endian.
10-
_HEADER_BYTEORDER: Literal["little"] = "little"
10+
HEADER_BYTEORDER: Literal["little"] = "little"
1111

1212

13-
def _pad_to(data: bytes, length: int) -> bytes:
13+
def pad_to(data: bytes, length: int) -> bytes:
1414
"""Returns the input followed by enough zero bytes to become the requested length.
1515
1616
Args:
@@ -29,14 +29,14 @@ def _pad_to(data: bytes, length: int) -> bytes:
2929
return data
3030

3131

32-
def _padding_required(offset: int, alignment: int) -> int:
32+
def padding_required(offset: int, alignment: int) -> int:
3333
"""Returns the padding required to align `offset` to `alignment`."""
3434
remainder: int = offset % alignment
3535
if remainder != 0:
3636
return alignment - remainder
3737
return 0
3838

3939

40-
def _aligned_size(input_size: int, alignment: int) -> int:
40+
def aligned_size(input_size: int, alignment: int) -> int:
4141
"""Returns input_size padded up to the next whole multiple of alignment."""
42-
return input_size + _padding_required(input_size, alignment)
42+
return input_size + padding_required(input_size, alignment)

0 commit comments

Comments
 (0)