Skip to content

Commit

Permalink
Simplify handling of identifiers
Browse files Browse the repository at this point in the history
Ref. #691, #1106
  • Loading branch information
treiher committed Jul 14, 2022
1 parent 9e979cc commit 698d206
Show file tree
Hide file tree
Showing 14 changed files with 609 additions and 645 deletions.
203 changes: 102 additions & 101 deletions rflx/ada.py

Large diffs are not rendered by default.

18 changes: 8 additions & 10 deletions rflx/expression.py
Original file line number Diff line number Diff line change
Expand Up @@ -1078,7 +1078,7 @@ def variables(self) -> List[Variable]:
return []

def ada_expr(self) -> ada.Expr:
return ada.Literal(ada.ID(self.identifier))
return ada.Literal(self.identifier)

@lru_cache(maxsize=None)
def z3expr(self) -> z3.ExprRef:
Expand Down Expand Up @@ -1144,7 +1144,7 @@ def variables(self) -> List["Variable"]:
return [self]

def ada_expr(self) -> ada.Expr:
return ada.Variable(ada.ID(self.identifier), self.negative)
return ada.Variable(self.identifier, self.negative)

@lru_cache(maxsize=None)
def z3expr(self) -> z3.ExprRef:
Expand Down Expand Up @@ -1516,7 +1516,7 @@ def substituted(
return expr

def ada_expr(self) -> ada.Expr:
return ada.Selected(self.prefix.ada_expr(), ada.ID(self.selector), self.negative)
return ada.Selected(self.prefix.ada_expr(), ID(self.selector), self.negative)

@lru_cache(maxsize=None)
def z3expr(self) -> z3.ExprRef:
Expand Down Expand Up @@ -1612,9 +1612,7 @@ def representation(self) -> str:
return call

def ada_expr(self) -> ada.Expr:
return ada.Call(
ada.ID(self.identifier), [a.ada_expr() for a in self.args], {}, self.negative
)
return ada.Call(self.identifier, [a.ada_expr() for a in self.args], {}, self.negative)

@lru_cache(maxsize=None)
def z3expr(self) -> z3.ExprRef:
Expand Down Expand Up @@ -1812,9 +1810,9 @@ def simplified(self) -> Expr:
raise NotImplementedError

def ada_expr(self) -> ada.Expr:
elements: List[Tuple[Union[ada.StrID, ada.Expr], ada.Expr]] = [
elements: List[Tuple[Union[ID, ada.Expr], ada.Expr]] = [
(
ada.ID(n) if isinstance(n, ID) else n.ada_expr(),
n if isinstance(n, ID) else n.ada_expr(),
e.ada_expr(),
)
for n, e in self.elements
Expand Down Expand Up @@ -2437,7 +2435,7 @@ def simplified(self) -> Expr:
)

def ada_expr(self) -> ada.Expr:
return ada.Conversion(ada.ID(self.identifier), self.argument.ada_expr())
return ada.Conversion(self.identifier, self.argument.ada_expr())

@lru_cache(maxsize=None)
def z3expr(self) -> z3.ExprRef:
Expand Down Expand Up @@ -2477,7 +2475,7 @@ def simplified(self) -> Expr:
return QualifiedExpr(self.type_identifier, self.expression.simplified())

def ada_expr(self) -> ada.Expr:
return ada.QualifiedExpr(ada.ID(self.type_identifier), self.expression.ada_expr())
return ada.QualifiedExpr(self.type_identifier, self.expression.ada_expr())

def z3expr(self) -> z3.ArithRef:
raise NotImplementedError
Expand Down
10 changes: 5 additions & 5 deletions rflx/generator/allocator.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,8 @@
from itertools import zip_longest
from typing import Dict, List, Optional, Sequence

from rflx import expression as expr, identifier as rid, typing_ as rty
from rflx import expression as expr, typing_ as rty
from rflx.ada import (
ID,
Add,
And,
AndThen,
Expand Down Expand Up @@ -43,6 +42,7 @@
WithClause,
)
from rflx.error import Location
from rflx.identifier import ID
from rflx.integration import Integration
from rflx.model import Session, State, declaration as decl, statement as stmt

Expand Down Expand Up @@ -92,7 +92,7 @@ def __init__(self, session: Session, integration: Integration, prefix: str = "")

@property
def unit_identifier(self) -> ID:
return ID(self._session.identifier.parent * f"{self._session.identifier.name}_Allocator")
return self._session.identifier.parent * f"{self._session.identifier.name}_Allocator"

@property
def declaration_context(self) -> List[ContextItem]:
Expand Down Expand Up @@ -121,7 +121,7 @@ def get_slot_ptr(self, location: Optional[Location]) -> ID:
slot_id: int = self._allocation_slots[location]
return self._slot_name(slot_id)

def get_size(self, variable: Optional[rid.ID] = None, state: Optional[rid.ID] = None) -> int:
def get_size(self, variable: Optional[ID] = None, state: Optional[ID] = None) -> int:
return self._integration.get_size(self._session.identifier, variable, state)

@staticmethod
Expand Down Expand Up @@ -344,7 +344,7 @@ def _allocate_global_slots(self) -> List[SlotInfo]:
return slots

@staticmethod
def _scope(state: State, var_id: rid.ID) -> Optional[rid.ID]:
def _scope(state: State, var_id: ID) -> Optional[ID]:
"""
Return the scope of the variable var_id.
Expand Down
43 changes: 22 additions & 21 deletions rflx/generator/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,8 @@
import enum
from typing import Callable, List, Mapping, Optional, Sequence, Tuple

from rflx import expression as expr, identifier as rid, model
from rflx import expression as expr, model
from rflx.ada import (
ID,
TRUE,
Add,
And,
Expand Down Expand Up @@ -50,6 +49,7 @@
WithClause,
)
from rflx.const import BUILTINS_PACKAGE
from rflx.identifier import ID

from . import const

Expand Down Expand Up @@ -101,7 +101,7 @@ def byte_aggregate(aggregate: expr.Aggregate) -> expr.Aggregate:
if embedded:
return expression.__class__(
expr.Indexed(
expr.Variable(rid.ID("Buffer") * "all"),
expr.Variable(ID("Buffer") * "all"),
expr.ValueRange(
expr.Call(
const.TYPES_TO_INDEX,
Expand Down Expand Up @@ -161,7 +161,7 @@ def field_value(field: model.Field) -> expr.Expr:
return expr.Call(f"Get_{field.name}", [expr.Variable("Ctx")])
return expr.Selected(
expr.Indexed(
expr.Variable(rid.ID("Ctx") * "Cursors" if not embedded else "Cursors"),
expr.Variable(ID("Ctx") * "Cursors" if not embedded else "Cursors"),
expr.Variable(field.affixed_name),
),
"Value",
Expand Down Expand Up @@ -198,7 +198,7 @@ def substitution_facts(
target_type: Optional[ID] = const.TYPES_BASE_INT,
) -> Mapping[expr.Name, expr.Expr]:
def prefixed(name: str) -> expr.Expr:
return expr.Variable(rid.ID("Ctx") * name) if not embedded else expr.Variable(name)
return expr.Variable(ID("Ctx") * name) if not embedded else expr.Variable(name)

first = prefixed("First")
last = expr.Call("Written_Last", [expr.Variable("Ctx")]) if public else prefixed("Written_Last")
Expand Down Expand Up @@ -798,7 +798,7 @@ def field_condition_call(
aggregate: Expr = None,
size: Expr = None,
) -> Expr:
package = ID(prefix * message.identifier)
package = prefix * message.identifier
if value is None:
value = Number(0)
if aggregate is None:
Expand All @@ -820,17 +820,17 @@ def field_condition_call(
)


def to_base_integer(prefix: str, type_package: rid.ID) -> ID:
def to_base_integer(prefix: str, type_package: ID) -> ID:
if type_package == BUILTINS_PACKAGE:
return ID("To_Base_Integer")
return prefix * ID(type_package) * "To_Base_Integer"
return prefix * type_package * "To_Base_Integer"


def ada_type_identifier(type_identifier: rid.ID) -> ID:
def ada_type_identifier(type_identifier: ID) -> ID:
if model.is_builtin_type(type_identifier):
return ID(type_identifier.name)
return type_identifier.name

return ID(type_identifier)
return type_identifier


def prefixed_type_identifier(type_identifier: ID, prefix: str) -> ID:
Expand All @@ -841,20 +841,18 @@ def prefixed_type_identifier(type_identifier: ID, prefix: str) -> ID:


def enum_name(enum_type: model.Enumeration) -> ID:
return ID(enum_type.name + "_Enum")
return ID(enum_type.name) + "_Enum"


def full_enum_name(enum_type: model.Enumeration) -> ID:
return ID(enum_type.identifier + "_Enum")
return enum_type.identifier + "_Enum"


def sequence_name(message: model.Message, field: model.Field) -> ID:
return ID(message.types[field].identifier)
return message.types[field].identifier


def contains_function_name(
refinement_package: rid.ID, pdu: rid.ID, sdu: rid.ID, field: rid.ID
) -> str:
def contains_function_name(refinement_package: ID, pdu: ID, sdu: ID, field: ID) -> str:
sdu_name = sdu.name if sdu.parent == refinement_package else sdu
pdu_name = pdu.name if pdu.parent == refinement_package else pdu
return f"{sdu_name.flat}_In_{pdu_name.flat}_{field}"
Expand Down Expand Up @@ -908,7 +906,7 @@ def create_sequence_instantiation(
flat: bool = False,
) -> Tuple[List[ContextItem], GenericPackageInstantiation]:
element_type = sequence_type.element_type
element_type_package = ID(element_type.package.name)
element_type_package = element_type.package.name

sequence_context: List[ContextItem] = []
sequence_package: GenericPackageInstantiation
Expand Down Expand Up @@ -936,7 +934,7 @@ def create_sequence_instantiation(
],
)
elif isinstance(element_type, model.Scalar):
element_type_identifier = ID(prefix * element_type.identifier)
element_type_identifier = prefix * element_type.identifier
sequence_context = [
WithClause(prefix * const.SCALAR_SEQUENCE_PACKAGE),
*(
Expand Down Expand Up @@ -1093,8 +1091,11 @@ def byte_aligned_field(prefix: str, message: model.Message, field: model.Field)
return Equal(
Rem(
Call(
ID(prefix * message.identifier * "Field_First"),
[Variable("Ctx"), Variable(ID(prefix * message.identifier * field.affixed_name))],
prefix * message.identifier * "Field_First",
[
Variable("Ctx"),
Variable(prefix * message.identifier * field.affixed_name),
],
),
Size(const.TYPES_BYTE),
),
Expand Down
17 changes: 9 additions & 8 deletions rflx/generator/const.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
from rflx import ada
from rflx.common import file_name
from rflx.identifier import ID

REFINEMENT_PACKAGE = ada.ID("Contains")
REFINEMENT_PACKAGE = ID("Contains")

ARITHMETIC_PACKAGE = ada.ID("RFLX_Arithmetic")
BUILTIN_TYPES_CONVERSIONS_PACKAGE = ada.ID("RFLX_Builtin_Types.Conversions")
BUILTIN_TYPES_PACKAGE = ada.ID("RFLX_Builtin_Types")
GENERIC_TYPES_PACKAGE = ada.ID("RFLX_Generic_Types")
MESSAGE_SEQUENCE_PACKAGE = ada.ID("RFLX_Message_Sequence")
SCALAR_SEQUENCE_PACKAGE = ada.ID("RFLX_Scalar_Sequence")
TYPES_PACKAGE = ada.ID("RFLX_Types")
ARITHMETIC_PACKAGE = ID("RFLX_Arithmetic")
BUILTIN_TYPES_CONVERSIONS_PACKAGE = ID("RFLX_Builtin_Types.Conversions")
BUILTIN_TYPES_PACKAGE = ID("RFLX_Builtin_Types")
GENERIC_TYPES_PACKAGE = ID("RFLX_Generic_Types")
MESSAGE_SEQUENCE_PACKAGE = ID("RFLX_Message_Sequence")
SCALAR_SEQUENCE_PACKAGE = ID("RFLX_Scalar_Sequence")
TYPES_PACKAGE = ID("RFLX_Types")

LIBRARY_FILES = [
file_name(str(p)) + ".ads"
Expand Down
Loading

0 comments on commit 698d206

Please sign in to comment.