oppc/code: support leave keyword
[openpower-isa.git] / src / openpower / oppc / pc_ast.py
index 5a8d0a06e56a3557a8b78fefb418503f9c98d72b..2626b3583032ec50ad8336143728bd60b80dc5da 100644 (file)
@@ -10,6 +10,9 @@ class Node(metaclass=NodeMeta):
     def __repr__(self):
         return f"{hex(id(self))}@{self.__class__.__name__}()"
 
+    def __hash__(self):
+        return id(self)
+
     def __eq__(self, other):
         if not isinstance(other, self.__class__):
             return NotImplemented
@@ -67,10 +70,6 @@ class Sequence(Node, tuple, metaclass=SequenceMeta):
         return f"{hex(id(self))}@{self.__class__.__name__}({repr(list(self))})"
 
 
-class Arguments(Sequence):
-    pass
-
-
 class Scope(Sequence):
     pass
 
@@ -149,6 +148,26 @@ class XER(Literal, choices=("OV", "OV32", "CA", "CA32", "SO")):
     pass
 
 
+class Reserve(Literal, choices=("RESERVE", "RESERVE_LENGTH", "RESERVE_ADDR")):
+    pass
+
+
+class Overflow(Literal, choices=("overflow",)):
+    pass
+
+
+class Special(Literal, choices=(
+            "CR", "LR", "CTR", "TAR", "FPSCR", "MSR",
+            "SVSTATE", "SVREMAP", "SRR0", "SRR1",
+            "SVSHAPE0", "SVSHAPE1", "SVSHAPE2", "SVSHAPE3",
+        )):
+    pass
+
+
+class XLEN(Literal, choices=("XLEN",)):
+    pass
+
+
 class IntLiteral(Literal):
     pass
 
@@ -231,7 +250,13 @@ class RParenthesis(Token):
 
 
 class Call(Dataclass):
-    name: Symbol
+    class Name(Symbol):
+        pass
+
+    class Arguments(Sequence):
+        pass
+
+    name: Name
     args: Arguments
 
 
@@ -245,12 +270,12 @@ class AssignIEAOp(Token):
     pass
 
 
-class Assign(Dataclass):
+class AssignExpr(Dataclass):
     lvalue: Node
     rvalue: Node
 
 
-class AssignIEA(Assign):
+class AssignIEAExpr(AssignExpr):
     lvalue: Node
     rvalue: Node
 
@@ -516,12 +541,12 @@ class RepeatExpr(Dataclass):
     times: Node
 
 
-class Subscript(Dataclass):
+class SubscriptExpr(Dataclass):
     index: Node
     subject: Node = Node()
 
 
-class RangeSubscript(Dataclass):
+class RangeSubscriptExpr(Dataclass):
     start: Node
     end: Node = Node()
     subject: Node = Node()