Mercurial > pysmcl
changeset 231:a096603611ba
range_analysis: range is now not including the upper bound
author | Sigurd Meldgaard <stm@daimi.au.dk> |
---|---|
date | Mon, 04 Jan 2010 12:54:47 +0100 |
parents | 0d4a1589f475 |
children | 3a5b4f442381 |
files | pysmcl/range_analysis.py |
diffstat | 1 files changed, 15 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/pysmcl/range_analysis.py Mon Jan 04 12:34:09 2010 +0100 +++ b/pysmcl/range_analysis.py Mon Jan 04 12:54:47 2010 +0100 @@ -5,6 +5,7 @@ range in a given function. A range is represented as a tuple of two numbers or the bottom element. """ +import numbers import pysmcl.ast_wrapper as ast from pysmcl import flow import pysmcl.setup as setup @@ -60,6 +61,12 @@ covered by that of other. """ return self.a >= other.a and self.b <= other.b + def __sub__(self, other): + if(isinstance(other, numbers.Number)): + return Range(self[0] - other, self[1] - other) + else: + raise NotImplemented + def __eq__(self, other): if isinstance(other, Bottom): return False @@ -112,6 +119,12 @@ """Combining with bottom yields bottom""" return self + def __sub__(self, other): + if(isinstance(other, numbers.Number)): + return self + else: + raise NotImplemented + def __repr__(self): return "_|_" @@ -357,10 +370,10 @@ if node.func.id == "range": if(len(node.args) > 1): lower = self.visit(node.args[0]) - return lower.combine(self.visit(node.args[1])) + return lower.combine(self.visit(node.args[1]) - 1) else: lower = Range(0, 0) - return lower.combine(self.visit(node.args[0])) + return lower.combine(self.visit(node.args[0]) - 1) if node.func.id == "random_bit": return Range(0, 1) return full_range(self.prime)