|
45 | 45 | LOGGER = logging.getLogger(__name__) |
46 | 46 |
|
47 | 47 |
|
48 | | -class VUnit(object): # pylint: disable=too-many-instance-attributes |
| 48 | +class VUnit(object): # pylint: disable=too-many-instance-attributes, too-many-public-methods |
49 | 49 | """ |
50 | 50 | The public interface of VUnit |
51 | 51 | """ |
@@ -141,37 +141,47 @@ def _create_argument_parser(cls): |
141 | 141 | return parser |
142 | 142 |
|
143 | 143 | @staticmethod |
144 | | - def available_simulators(): |
| 144 | + def supported_simulators(): |
| 145 | + """ |
| 146 | + Return a list of supported simulator classes |
| 147 | + """ |
| 148 | + return [ModelSimInterface] |
| 149 | + |
| 150 | + @classmethod |
| 151 | + def available_simulators(cls): |
145 | 152 | """ |
146 | 153 | Return a list of available simulators |
147 | 154 | """ |
148 | | - sims = {} |
149 | | - if ModelSimInterface.is_available(): |
150 | | - sims[ModelSimInterface.name] = ModelSimInterface |
151 | | - if len(sims) == 0: |
152 | | - raise RuntimeError("No simulator detected. " |
153 | | - "Simulator executables must be available in PATH environment variable.") |
154 | | - return sims |
| 155 | + return [simulator_class |
| 156 | + for simulator_class in cls.supported_simulators() |
| 157 | + if simulator_class.is_available()] |
155 | 158 |
|
156 | 159 | @classmethod |
157 | 160 | def select_simulator(cls): |
158 | 161 | """ |
159 | 162 | Select simulator class, either from VUNIT_SIMULATOR environment variable |
160 | 163 | or the first available |
161 | 164 | """ |
162 | | - simulators = cls.available_simulators() |
163 | 165 | environ_name = "VUNIT_SIMULATOR" |
164 | 166 |
|
| 167 | + available_simulators = cls.available_simulators() |
| 168 | + name_mapping = {simulator_class.name: simulator_class for simulator_class in cls.supported_simulators()} |
| 169 | + if len(available_simulators) == 0: |
| 170 | + raise RuntimeError("No available simulator detected. " |
| 171 | + "Simulator executables must be available in PATH environment variable.") |
| 172 | + |
165 | 173 | if environ_name in os.environ: |
166 | 174 | simulator_name = os.environ[environ_name] |
167 | | - if simulator_name not in simulators: |
| 175 | + if simulator_name not in name_mapping: |
168 | 176 | raise RuntimeError( |
169 | | - ("Simulator from " + environ_name + " environment variable %r is not available. " |
170 | | - "Available simulators are %r") |
171 | | - % (simulator_name, simulators.keys())) |
| 177 | + ("Simulator from " + environ_name + " environment variable %r is not supported. " |
| 178 | + "Supported simulators are %r") |
| 179 | + % (simulator_name, name_mapping.keys())) |
| 180 | + simulator_class = name_mapping[simulator_name] |
172 | 181 | else: |
173 | | - simulator_name = simulators.keys()[0] |
174 | | - return simulators[simulator_name] |
| 182 | + simulator_class = available_simulators[0] |
| 183 | + |
| 184 | + return simulator_class |
175 | 185 |
|
176 | 186 | def __init__(self, # pylint: disable=too-many-locals, too-many-arguments |
177 | 187 | output_path, |
@@ -221,7 +231,10 @@ def __init__(self, # pylint: disable=too-many-locals, too-many-arguments |
221 | 231 | if simulator_class is not None: |
222 | 232 | self._simulator_class = simulator_class |
223 | 233 | else: |
224 | | - self._simulator_class = self.available_simulators().values()[0] |
| 234 | + self._simulator_class = self.select_simulator() |
| 235 | + |
| 236 | + if not self._simulator_class.is_available(): |
| 237 | + raise AssertionError("Simulator %s is not available" % self._simulator_class.name) |
225 | 238 |
|
226 | 239 | self._sim_specific_path = join(self._output_path, self._simulator_class.name) |
227 | 240 | self._create_output_path(clean) |
|
0 commit comments