aboutsummaryrefslogtreecommitdiff
path: root/scripts/pdl/core.py
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/pdl/core.py')
-rw-r--r--scripts/pdl/core.py32
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):