diff options
Diffstat (limited to 'scripts/pdl/core.py')
-rw-r--r-- | scripts/pdl/core.py | 32 |
1 files changed, 30 insertions, 2 deletions
diff --git a/scripts/pdl/core.py b/scripts/pdl/core.py index f55bb30..5ddbb02 100644 --- a/scripts/pdl/core.py +++ b/scripts/pdl/core.py @@ -68,6 +68,15 @@ def desugar(file: File): fields.extend(desugar_field_(f, fields[-1] if len(fields) > 0 else None, {})) d.fields = fields + # Add backlinks from optional links to their flag scalar + # field declaration. + fields_by_id = dict() + for f in d.fields: + if hasattr(f, 'id'): + fields_by_id[f.id] = f + if f.cond: + fields_by_id[f.cond.id].cond_for = f + declarations.append(d) file.declarations = declarations @@ -173,13 +182,29 @@ def get_derived_packets( return children +def get_all_packet_constraints( + decl: Union[PacketDeclaration, StructDeclaration] +) -> List[Constraint]: + """Return the list of constraints defined in the selected packet and + its parent declarations.""" + + constraints = [] + while decl.parent_id: + constraints.extend(decl.constraints) + decl = decl.parent + return constraints + + def get_field_size(field: Field, skip_payload: bool = False) -> Optional[int]: """Determine the size of a field in bits, if possible. If the field is dynamically sized (e.g. unsized array or payload field), None is returned instead. If skip_payload is set, payload and body fields are counted as having size 0 rather than a variable size.""" - if isinstance(field, (ScalarField, SizeField, CountField, ReservedField)): + if field.cond: + return None + + elif isinstance(field, (ScalarField, SizeField, CountField, ReservedField)): return field.width elif isinstance(field, FixedField): @@ -324,7 +349,10 @@ def is_bit_field(field: Field) -> bool: These include: ScalarField, FixedField, TypedefField with enum type, SizeField, and CountField.""" - if isinstance(field, (ScalarField, SizeField, CountField, FixedField, ReservedField)): + if field.cond: + return False + + elif isinstance(field, (ScalarField, SizeField, CountField, FixedField, ReservedField)): return True elif isinstance(field, TypedefField) and isinstance(field.type, EnumDeclaration): |