1from typing import Optional
2
3from ..errors import SimSolverError
4from . import SimConcretizationStrategy
5
6
7class SimConcretizationStrategyMax(SimConcretizationStrategy):
8    """
9    Concretization strategy that returns the maximum address.
10    """
11
12    def __init__(self, max_addr: Optional[int]=None):
13        super().__init__()
14        self._max_addr = max_addr
15
16    def _concretize(self, memory, addr):
17        if self._max_addr is None:
18            return [ self._max(memory, addr) ]
19        else:
20            try:
21                return [ self._max(memory, addr, extra_constraints=(addr <= self._max_addr,)) ]
22            except SimSolverError:
23                return [ self._max(memory, addr) ]
24