Skip to content
Snippets Groups Projects
Commit 3aaaf304 authored by Ettayeb Yassine's avatar Ettayeb Yassine
Browse files

TP3: Treillis des intervalles, version finale

parent 71873050
No related branches found
No related tags found
No related merge requests found
...@@ -405,44 +405,61 @@ def reduce_state(s: state,c: BoolExpr) -> state: ...@@ -405,44 +405,61 @@ def reduce_state(s: state,c: BoolExpr) -> state:
class Interval_analysis(Transfer[state]): class Interval_analysis(Transfer[state]):
variables: frozenset[str] variables: frozenset[str]
def __init__(self,instr: Instr):
def __init__(self, instr: Instr):
self.variables = variables_of_instr(instr) self.variables = variables_of_instr(instr)
def bottom(self) -> state: def bottom(self) -> state:
return None return None
def init_state(self) -> state: def init_state(self) -> state:
return dict.fromkeys(self.variables, Interval(None,None)) return dict.fromkeys(self.variables, Interval(None, None))
def join(self,s1:state,s2:state) -> state:
if s1 is None: return s2 def join(self, s1: state, s2: state) -> state:
if s2 is None: return s1 if s1 is None:
res: abstract_env = {} return s2
for var in self.variables: if s2 is None:
v1 = s1[var] return s1
v2 = s2[var] return {v: interval_join(s1[v], s2[v]) for v in self.variables}
v = interval_join(v1,v2)
res[var] = v def widen(self, s1: state, s2: state) -> state:
return res if s1 is None:
return s2
def widen(self, s1:state, s2:state) -> state: if s2 is None:
raise NotImplementedError return s1
return {v: interval_widen(s1[v], s2[v]) for v in self.variables}
def included(self,s1: state,s2: state) -> bool:
if s1 is None: return True def included(self, s1: state, s2: state) -> bool:
if s2 is None: return False if s1 is None:
for var in self.variables: return True
if not interval_leq(s1[var],s2[var]): return False if s2 is None:
return True return False
return all(interval_leq(s1[v], s2[v]) for v in self.variables)
def tr_skip(self,s: state) -> state:
def tr_skip(self, s: state) -> state:
return s return s
def tr_set(self,s: state,v: str,e: ArithExpr) -> state: def tr_set(self, s: state, v: str, e: ArithExpr) -> state:
raise NotImplementedError if s is None:
return None
val = eval_aexp(s, e)
if val is None:
return None
s1 = s.copy()
s1[v] = val if not isinstance(val, Top) else Interval(None, None)
return s1
def tr_test(self,s: state,c: BoolExpr) -> state: def tr_test(self, s: state, c: BoolExpr) -> state:
raise NotImplementedError return reduce_state(s, c)
def tr_err(self,s: state,e: Expr) -> state: def tr_err(self, s: state, e: Expr) -> state:
raise NotImplementedError if s is None:
return None
if isinstance(e, ArithExpr):
return s if eval_aexp(s, e) is not None else None
if isinstance(e, BoolExpr):
return s if eval_bexp(s, e) is not None else None
return s
def analyze(i: Instr) -> None: def analyze(i: Instr) -> None:
cfg = Cfg(i) cfg = Cfg(i)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment