diff --git a/example/main.dart b/example/main.dart index a951387..0e0fdb1 100644 --- a/example/main.dart +++ b/example/main.dart @@ -97,7 +97,7 @@ class CounterTest extends Test { Simulator.registerAction(3, () { intf.reset.put(1); }); - Simulator.registerAction(35, () { + Simulator.registerAction(33, () { intf.reset.put(0); }); diff --git a/lib/src/drivers/pending_driver.dart b/lib/src/drivers/pending_driver.dart index 4e84a2e..12032d2 100644 --- a/lib/src/drivers/pending_driver.dart +++ b/lib/src/drivers/pending_driver.dart @@ -85,7 +85,7 @@ abstract class PendingDriver } /// A special version of [ListQueue] that uses a [QuiesceObjector]. -class _PendingQueue extends ListQueue { +class _PendingQueue implements Queue { final Component parent; final Future Function()? timeout; @@ -93,7 +93,19 @@ class _PendingQueue extends ListQueue { late final QuiesceObjector _quiesceObjector; - _PendingQueue({ + final ListQueue _listQueue = ListQueue(); + + factory _PendingQueue( + {required Component parent, + required Future Function()? timeout, + required Future Function()? dropDelay}) => + _PendingQueue._( + parent: parent, + timeout: timeout, + dropDelay: dropDelay, + ); + + _PendingQueue._({ required this.parent, required this.timeout, required this.dropDelay, @@ -111,64 +123,163 @@ class _PendingQueue extends ListQueue { @override void add(E value) { - super.add(value); + _listQueue.add(value); _reconsiderObjection(); } @override void addAll(Iterable iterable) { - super.addAll(iterable); + _listQueue.addAll(iterable); _reconsiderObjection(); } @override void addFirst(E value) { - super.addFirst(value); + _listQueue.addFirst(value); _reconsiderObjection(); } @override void addLast(E value) { - super.addLast(value); + _listQueue.addLast(value); _reconsiderObjection(); } @override void clear() { - super.clear(); + _listQueue.clear(); _reconsiderObjection(); } @override bool remove(Object? value) { - final res = super.remove(value); + final res = _listQueue.remove(value); _reconsiderObjection(); return res; } @override E removeFirst() { - final res = super.removeFirst(); + final res = _listQueue.removeFirst(); _reconsiderObjection(); return res; } @override E removeLast() { - final res = super.removeLast(); + final res = _listQueue.removeLast(); _reconsiderObjection(); return res; } @override void removeWhere(bool Function(E element) test) { - super.removeWhere(test); + _listQueue.removeWhere(test); _reconsiderObjection(); } @override void retainWhere(bool Function(E element) test) { - super.retainWhere(test); + _listQueue.retainWhere(test); _reconsiderObjection(); } + + @override + bool any(bool Function(E element) test) => _listQueue.any(test); + + @override + Queue cast() => _listQueue.cast(); + + @override + bool contains(Object? element) => _listQueue.contains(element); + + @override + E elementAt(int index) => _listQueue.elementAt(index); + + @override + bool every(bool Function(E element) test) => _listQueue.every(test); + + @override + Iterable expand(Iterable Function(E element) toElements) => + _listQueue.expand(toElements); + + @override + E get first => _listQueue.first; + + @override + E firstWhere(bool Function(E element) test, {E Function()? orElse}) => + _listQueue.firstWhere(test, orElse: orElse); + + @override + T fold(T initialValue, T Function(T previousValue, E element) combine) => + _listQueue.fold(initialValue, combine); + + @override + Iterable followedBy(Iterable other) => _listQueue.followedBy(other); + + @override + void forEach(void Function(E element) action) => _listQueue.forEach(action); + + @override + bool get isEmpty => _listQueue.isEmpty; + + @override + bool get isNotEmpty => _listQueue.isNotEmpty; + + @override + Iterator get iterator => _listQueue.iterator; + + @override + String join([String separator = '']) => _listQueue.join(separator); + + @override + E get last => _listQueue.last; + + @override + E lastWhere(bool Function(E element) test, {E Function()? orElse}) => + _listQueue.lastWhere(test, orElse: orElse); + + @override + int get length => _listQueue.length; + + @override + Iterable map(T Function(E e) toElement) => _listQueue.map(toElement); + + @override + E reduce(E Function(E value, E element) combine) => + _listQueue.reduce(combine); + + @override + E get single => _listQueue.single; + + @override + E singleWhere(bool Function(E element) test, {E Function()? orElse}) => + _listQueue.singleWhere(test, orElse: orElse); + + @override + Iterable skip(int count) => _listQueue.skip(count); + + @override + Iterable skipWhile(bool Function(E value) test) => + _listQueue.skipWhile(test); + + @override + Iterable take(int count) => _listQueue.take(count); + + @override + Iterable takeWhile(bool Function(E value) test) => + _listQueue.takeWhile(test); + + @override + List toList({bool growable = true}) => + _listQueue.toList(growable: growable); + + @override + Set toSet() => _listQueue.toSet(); + + @override + Iterable where(bool Function(E element) test) => _listQueue.where(test); + + @override + Iterable whereType() => _listQueue.whereType(); } diff --git a/lib/src/test.dart b/lib/src/test.dart index bb15e7b..b1e73b4 100644 --- a/lib/src/test.dart +++ b/lib/src/test.dart @@ -184,15 +184,20 @@ abstract class Test extends Component { } logger.finest('Waiting for objections to finish...'); + (Object?, StackTrace)? simulatorError; + unawaited(Simulator.run().onError((e, s) { + simulatorError = (e, s); + })); + await Future.any([ - Simulator.run(), + Simulator.simulationEnded, runPhase.allObjectionsDropped(), ]); if (runPhase.objections.isNotEmpty) { logger .warning('Simulation has ended before all objections were dropped!'); - } else { + } else if (!Simulator.simulationHasEnded) { logger.finest('Objections completed, ending simulation.'); unawaited(Simulator.endSimulation()); } @@ -201,6 +206,11 @@ abstract class Test extends Component { await Simulator.simulationEnded; } + if (simulatorError != null) { + logger.severe( + 'Simulator error detected!', simulatorError!.$1, simulatorError!.$2); + } + logger.finest('Running end of test checks.'); _checkAll(); diff --git a/lib/src/waiter.dart b/lib/src/waiter.dart index e30214f..5aa2ba5 100644 --- a/lib/src/waiter.dart +++ b/lib/src/waiter.dart @@ -40,16 +40,13 @@ extension LogicWaiter on Logic { switch (edge) { case Edge.pos: await nextPosedge; - break; case Edge.neg: await nextNegedge; - break; case Edge.any: await Future.any([ nextPosedge, nextNegedge, ]); - break; } } } diff --git a/pubspec.yaml b/pubspec.yaml index 138b106..c64b17e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -7,13 +7,13 @@ issue_tracker: https://github.com/intel/rohd-vf/issues documentation: https://intel.github.io/rohd-vf/rohd_vf/rohd_vf-library.html environment: - sdk: '>=2.18.0 <4.0.0' + sdk: '>=3.0.0 <4.0.0' dependencies: async: ^2.11.0 logging: ^1.0.1 meta: ^1.3.0 - rohd: ^0.5.0 + rohd: ^0.6.0 dev_dependencies: test: ^1.17.3 diff --git a/test/test_test.dart b/test/test_test.dart index 9bf1ede..f39c28b 100644 --- a/test/test_test.dart +++ b/test/test_test.dart @@ -177,6 +177,31 @@ void main() { expect(sawError, isFalse); }); + test('exception at end of sim action', () async { + final test = NormalTest()..printLevel = Level.OFF; + + Object? seenError; + Logger.root.onRecord.listen((record) { + if (record.error != null) { + seenError = record.error; + } + }); + + Simulator.registerEndOfSimulationAction(() async { + throw Exception('endofsim'); + }); + + try { + await test.start(); + fail('Expected exception to be thrown.'); + } on Exception catch (e) { + expect(e.toString(), contains('Test failed.')); + } + + expect(seenError, isNotNull); + expect(seenError.toString(), contains('endofsim')); + }); + group('Test.instance', () { test('test already created', () async { NormalTest(); diff --git a/test/waiter_test.dart b/test/waiter_test.dart index e182e15..043e964 100644 --- a/test/waiter_test.dart +++ b/test/waiter_test.dart @@ -34,7 +34,7 @@ void main() { await clk.waitCycles(0); - expect(Simulator.time, 5); + expect(Simulator.time, 0); await Simulator.simulationEnded; }); diff --git a/tool/gh_actions/generate_documentation.sh b/tool/gh_actions/generate_documentation.sh index 3fee321..d8a4bc0 100755 --- a/tool/gh_actions/generate_documentation.sh +++ b/tool/gh_actions/generate_documentation.sh @@ -17,7 +17,9 @@ set -euo pipefail # https://github.com/dart-lang/dartdoc/issues/2907 # https://github.com/dart-lang/dartdoc/issues/1959 -# Disabling --validate-links due to https://github.com/dart-lang/dartdoc/issues/3584 +# Disabling --validate-links due to +# https://github.com/dart-lang/dartdoc/issues/3584 +# https://github.com/dart-lang/dartdoc/issues/3939 # output=$(dart doc --validate-links 2>&1 | tee) output=$(dart doc 2>&1 | tee)