Loading tools/pdl/scripts/generate_python_backend.py +3 −17 Original line number Diff line number Diff line Loading @@ -155,7 +155,7 @@ class FieldParser: def parse_array_element_dynamic_(self, field: ast.ArrayField, span: str): """Parse a single array field element of variable size.""" if isinstance(field.type, ast.StructDeclaration): self.append_(f" element, span = {field.type_id}.parse({span})") self.append_(f" element, {span} = {field.type_id}.parse({span})") self.append_(f" {field.id}.append(element)") else: raise Exception(f'Unexpected array element type {field.type_id} {field.width}') Loading Loading @@ -353,13 +353,6 @@ class FieldParser: self.unchecked_append_(f"fields['{field.id}'] = {field.type_id}.parse_all({span})") self.offset = end_offset def parse_padding_field_(self, field: ast.PaddingField): """Parse a padding field. The value is ignored.""" if self.shift != 0: raise Exception('Padding field does not start on an octet boundary') self.offset += field.size def parse_payload_field_(self, field: Union[ast.BodyField, ast.PayloadField]): """Parse body and payload fields.""" Loading Loading @@ -483,7 +476,7 @@ class FieldParser: # Padding fields. elif isinstance(field, ast.PaddingField): self.parse_padding_field_(field) pass # Array fields. elif isinstance(field, ast.ArrayField): Loading Loading @@ -666,13 +659,6 @@ class FieldSerializer: else: self.append_(f"_span.extend(self.{field.id}.serialize())") def serialize_padding_field_(self, field: ast.PaddingField): """Serialize a padding field. The value is zero.""" if self.shift != 0: raise Exception('Padding field does not start on an octet boundary') self.append_(f"_span.extend([0] * {field.width})") def serialize_payload_field_(self, field: Union[ast.BodyField, ast.PayloadField]): """Serialize body and payload fields.""" Loading Loading @@ -714,7 +700,7 @@ class FieldSerializer: # Padding fields. elif isinstance(field, ast.PaddingField): self.serialize_padding_field_(field) pass # Array fields. elif isinstance(field, ast.ArrayField): Loading tools/pdl/scripts/pdl/core.py +10 −3 Original line number Diff line number Diff line Loading @@ -15,7 +15,8 @@ def desugar_field_(field: Field, previous: Field, constraints: Dict[str, Constra elif isinstance(field, PaddingField): previous.padded_size = field.size return [] field.padded_field = previous return [field] elif isinstance(field, TypedefField) and field.id in constraints: tag_id = constraints[field.id].tag_id Loading Loading @@ -124,7 +125,7 @@ def get_packet_ancestor( if decl.parent_id is None: return decl else: return get_packet_ancestor(decl.grammar.packet_scope[decl.parent_id]) return get_packet_ancestor(decl.file.packet_scope[decl.parent_id]) def get_derived_packets(decl: Union[PacketDeclaration, StructDeclaration] Loading Loading @@ -158,7 +159,11 @@ def get_field_size(field: Field, skip_payload: bool = False) -> Optional[int]: return field.width or field.type.width elif isinstance(field, PaddingField): return field.width * 8 # Padding field width is added to the padded field size. return 0 elif isinstance(field, ArrayField) and field.padded_size is not None: return field.padded_size * 8 elif isinstance(field, ArrayField) and field.size is not None: element_width = field.width or get_declaration_size(field.type) Loading Loading @@ -189,6 +194,8 @@ def get_declaration_size(decl: Declaration, skip_payload: bool = False) -> Optio elif isinstance(decl, (PacketDeclaration, StructDeclaration)): parent = decl.parent packet_size = get_declaration_size(parent, skip_payload=True) if parent else 0 if packet_size is None: return None for f in decl.fields: field_size = get_field_size(f, skip_payload=skip_payload) if field_size is None: Loading Loading
tools/pdl/scripts/generate_python_backend.py +3 −17 Original line number Diff line number Diff line Loading @@ -155,7 +155,7 @@ class FieldParser: def parse_array_element_dynamic_(self, field: ast.ArrayField, span: str): """Parse a single array field element of variable size.""" if isinstance(field.type, ast.StructDeclaration): self.append_(f" element, span = {field.type_id}.parse({span})") self.append_(f" element, {span} = {field.type_id}.parse({span})") self.append_(f" {field.id}.append(element)") else: raise Exception(f'Unexpected array element type {field.type_id} {field.width}') Loading Loading @@ -353,13 +353,6 @@ class FieldParser: self.unchecked_append_(f"fields['{field.id}'] = {field.type_id}.parse_all({span})") self.offset = end_offset def parse_padding_field_(self, field: ast.PaddingField): """Parse a padding field. The value is ignored.""" if self.shift != 0: raise Exception('Padding field does not start on an octet boundary') self.offset += field.size def parse_payload_field_(self, field: Union[ast.BodyField, ast.PayloadField]): """Parse body and payload fields.""" Loading Loading @@ -483,7 +476,7 @@ class FieldParser: # Padding fields. elif isinstance(field, ast.PaddingField): self.parse_padding_field_(field) pass # Array fields. elif isinstance(field, ast.ArrayField): Loading Loading @@ -666,13 +659,6 @@ class FieldSerializer: else: self.append_(f"_span.extend(self.{field.id}.serialize())") def serialize_padding_field_(self, field: ast.PaddingField): """Serialize a padding field. The value is zero.""" if self.shift != 0: raise Exception('Padding field does not start on an octet boundary') self.append_(f"_span.extend([0] * {field.width})") def serialize_payload_field_(self, field: Union[ast.BodyField, ast.PayloadField]): """Serialize body and payload fields.""" Loading Loading @@ -714,7 +700,7 @@ class FieldSerializer: # Padding fields. elif isinstance(field, ast.PaddingField): self.serialize_padding_field_(field) pass # Array fields. elif isinstance(field, ast.ArrayField): Loading
tools/pdl/scripts/pdl/core.py +10 −3 Original line number Diff line number Diff line Loading @@ -15,7 +15,8 @@ def desugar_field_(field: Field, previous: Field, constraints: Dict[str, Constra elif isinstance(field, PaddingField): previous.padded_size = field.size return [] field.padded_field = previous return [field] elif isinstance(field, TypedefField) and field.id in constraints: tag_id = constraints[field.id].tag_id Loading Loading @@ -124,7 +125,7 @@ def get_packet_ancestor( if decl.parent_id is None: return decl else: return get_packet_ancestor(decl.grammar.packet_scope[decl.parent_id]) return get_packet_ancestor(decl.file.packet_scope[decl.parent_id]) def get_derived_packets(decl: Union[PacketDeclaration, StructDeclaration] Loading Loading @@ -158,7 +159,11 @@ def get_field_size(field: Field, skip_payload: bool = False) -> Optional[int]: return field.width or field.type.width elif isinstance(field, PaddingField): return field.width * 8 # Padding field width is added to the padded field size. return 0 elif isinstance(field, ArrayField) and field.padded_size is not None: return field.padded_size * 8 elif isinstance(field, ArrayField) and field.size is not None: element_width = field.width or get_declaration_size(field.type) Loading Loading @@ -189,6 +194,8 @@ def get_declaration_size(decl: Declaration, skip_payload: bool = False) -> Optio elif isinstance(decl, (PacketDeclaration, StructDeclaration)): parent = decl.parent packet_size = get_declaration_size(parent, skip_payload=True) if parent else 0 if packet_size is None: return None for f in decl.fields: field_size = get_field_size(f, skip_payload=skip_payload) if field_size is None: Loading