From dfb4499a70ef3c84ebde7d1eda10a8173f1e8a9f Mon Sep 17 00:00:00 2001 From: glx Date: Sat, 21 Dec 2019 18:46:05 +0100 Subject: [PATCH] Add: is_read_only() --- nml/expression/array.py | 3 +++ nml/expression/base_expression.py | 8 ++++++++ nml/expression/bin_not.py | 6 ++++++ nml/expression/binop.py | 3 +++ nml/expression/bitmask.py | 3 +++ nml/expression/boolean.py | 3 +++ nml/expression/storage_op.py | 4 ++++ nml/expression/ternaryop.py | 3 +++ 8 files changed, 33 insertions(+) diff --git a/nml/expression/array.py b/nml/expression/array.py index 5b88bb12..f74ede13 100644 --- a/nml/expression/array.py +++ b/nml/expression/array.py @@ -35,3 +35,6 @@ def reduce(self, id_dicts = [], unknown_id_fatal = True): def collect_references(self): from itertools import chain return list(chain.from_iterable(v.collect_references() for v in self.values)) + + def is_read_only(self): + return all(v.is_read_only() for v in self.values) diff --git a/nml/expression/base_expression.py b/nml/expression/base_expression.py index a03b9103..366271c5 100644 --- a/nml/expression/base_expression.py +++ b/nml/expression/base_expression.py @@ -110,6 +110,14 @@ def collect_references(self): """ return [] + def is_read_only(self): + """ + Check if this expression store values. + + @return: True if the expression doesn't store values. + """ + return True + def is_boolean(self): """ Check if this expression is limited to 0 or 1 as value. diff --git a/nml/expression/bin_not.py b/nml/expression/bin_not.py index 7a5d111b..43650895 100644 --- a/nml/expression/bin_not.py +++ b/nml/expression/bin_not.py @@ -44,6 +44,9 @@ def supported_by_actionD(self, raise_error): def collect_references(self): return self.expr.collect_references() + def is_read_only(self): + return self.expr.is_read_only() + def __str__(self): return "~" + str(self.expr) @@ -82,6 +85,9 @@ def supported_by_actionD(self, raise_error): def collect_references(self): return self.expr.collect_references() + def is_read_only(self): + return self.expr.is_read_only() + def is_boolean(self): return True diff --git a/nml/expression/binop.py b/nml/expression/binop.py index e7e8eeb6..b7e16e34 100644 --- a/nml/expression/binop.py +++ b/nml/expression/binop.py @@ -184,6 +184,9 @@ def supported_by_actionD(self, raise_error): def collect_references(self): return self.expr1.collect_references() + self.expr2.collect_references() + def is_read_only(self): + return self.expr1.is_read_only() and self.expr2.is_read_only() + def is_boolean(self): if self.op in (nmlop.AND, nmlop.OR, nmlop.XOR): return self.expr1.is_boolean() and self.expr2.is_boolean() diff --git a/nml/expression/bitmask.py b/nml/expression/bitmask.py index 8df4afa0..a9cd5ba7 100644 --- a/nml/expression/bitmask.py +++ b/nml/expression/bitmask.py @@ -43,5 +43,8 @@ def collect_references(self): from itertools import chain return list(chain.from_iterable(v.collect_references() for v in self.values)) + def is_read_only(self): + return all(v.is_read_only() for v in self.values) + def __str__(self): return "bitmask(" + ", ".join(str(e) for e in self.values) + ")" diff --git a/nml/expression/boolean.py b/nml/expression/boolean.py index 1fc1c532..859b6674 100644 --- a/nml/expression/boolean.py +++ b/nml/expression/boolean.py @@ -47,6 +47,9 @@ def supported_by_actionD(self, raise_error): def collect_references(self): return self.expr.collect_references() + def is_read_only(self): + return self.expr.is_read_only() + def is_boolean(self): return True diff --git a/nml/expression/storage_op.py b/nml/expression/storage_op.py index afa0fd54..ba5d2598 100644 --- a/nml/expression/storage_op.py +++ b/nml/expression/storage_op.py @@ -124,3 +124,7 @@ def supported_by_actionD(self, raise_error): def collect_references(self): return self.register.collect_references() + (self.value.collect_references() if self.value is not None else []) + + def is_read_only(self): + assert(self.info['store'] == (self.value is not None)) + return (not self.info['store']) and self.register.is_read_only() diff --git a/nml/expression/ternaryop.py b/nml/expression/ternaryop.py index a0c6e57f..fc270408 100644 --- a/nml/expression/ternaryop.py +++ b/nml/expression/ternaryop.py @@ -54,6 +54,9 @@ def supported_by_actionD(self, raise_error): def collect_references(self): return self.guard.collect_references() + self.expr1.collect_references() + self.expr2.collect_references() + def is_read_only(self): + return self.expr1.is_read_only() and self.expr2.is_read_only() + def is_boolean(self): return self.expr1.is_boolean() and self.expr2.is_boolean()