1 //
2 // Copyright (c) 2010-2022 Antmicro
3 //
4 // This file is licensed under the MIT License.
5 // Full license text is available in 'licenses/MIT.txt'.
6 //
7 
8 using System.Linq;
9 using Antmicro.Renode.Core;
10 using Antmicro.Renode.Time;
11 
12 namespace Antmicro.Renode.UserInterface
13 {
14     // this class provides extension methods for monitor only!
15     public static class MonitorTimeExtensions
16     {
SetAdvanceImmediately(this Machine @this, bool val)17         public static void SetAdvanceImmediately(this Machine @this, bool val)
18         {
19             @this.LocalTimeSource.AdvanceImmediately = val;
20         }
21 
SetQuantum(this Machine @this, TimeInterval interval)22         public static void SetQuantum(this Machine @this, TimeInterval interval)
23         {
24             @this.LocalTimeSource.Quantum = interval;
25         }
26 
GetTimeSourceInfo(this Machine @this)27         public static string GetTimeSourceInfo(this Machine @this)
28         {
29             return @this.LocalTimeSource.ToString();
30         }
31 
SetAdvanceImmediately(this Emulation @this, bool val)32         public static void SetAdvanceImmediately(this Emulation @this, bool val)
33         {
34             @this.MasterTimeSource.AdvanceImmediately = val;
35         }
36 
SetQuantum(this Emulation @this, TimeInterval interval)37         public static void SetQuantum(this Emulation @this, TimeInterval interval)
38         {
39             @this.MasterTimeSource.Quantum = interval;
40         }
41 
SetGlobalQuantum(this Emulation @this, TimeInterval quantum)42         public static void SetGlobalQuantum(this Emulation @this, TimeInterval quantum)
43         {
44             SetQuantumRecursively(@this.MasterTimeSource, quantum);
45         }
46 
SetGlobalAdvanceImmediately(this Emulation @this, bool val)47         public static void SetGlobalAdvanceImmediately(this Emulation @this, bool val)
48         {
49             SetAdvanceImmediatelyRecursively(@this.MasterTimeSource, val);
50         }
51 
GetTimeSourceInfo(this Emulation @this)52         public static string GetTimeSourceInfo(this Emulation @this)
53         {
54             return @this.MasterTimeSource.ToString();
55         }
56 
SetGlobalSerialExecution(this Emulation @this, bool val)57         public static void SetGlobalSerialExecution(this Emulation @this, bool val)
58         {
59             SetSerialExecutionRecursively(@this.MasterTimeSource, val);
60         }
61 
SetSerialExecution(this Machine @this, bool val)62         public static bool SetSerialExecution(this Machine @this, bool val)
63         {
64             var previousValue = @this.LocalTimeSource.ExecuteInSerial;
65             @this.LocalTimeSource.ExecuteInSerial = val;
66             return previousValue;
67         }
68 
SetSerialExecutionRecursively(TimeSourceBase source, bool val)69         private static void SetSerialExecutionRecursively(TimeSourceBase source, bool val)
70         {
71             source.ExecuteInSerial = val;
72             foreach(var sink in source.Sinks.OfType<TimeSourceBase>())
73             {
74                  SetSerialExecutionRecursively(sink, val);
75             }
76         }
77 
SetAdvanceImmediatelyRecursively(TimeSourceBase source, bool val)78         private static void SetAdvanceImmediatelyRecursively(TimeSourceBase source, bool val)
79         {
80             source.AdvanceImmediately = val;
81             foreach(var sink in source.Sinks.OfType<TimeSourceBase>())
82             {
83                 SetAdvanceImmediatelyRecursively(sink, val);
84             }
85         }
86 
SetQuantumRecursively(TimeSourceBase source, TimeInterval quantum)87         private static void SetQuantumRecursively(TimeSourceBase source, TimeInterval quantum)
88         {
89             source.Quantum = quantum;
90             foreach(var sink in source.Sinks.OfType<TimeSourceBase>())
91             {
92                 SetQuantumRecursively(sink, quantum);
93             }
94         }
95     }
96 }