1 // 2 // Copyright (c) 2010-2023 Antmicro 3 // 4 // This file is licensed under the MIT License. 5 // Full license text is available in 'licenses/MIT.txt'. 6 // 7 using System; 8 using Antmicro.Renode.Core; 9 using Antmicro.Migrant.Hooks; 10 using Microsoft.Scripting.Hosting; 11 using Antmicro.Migrant; 12 using Antmicro.Renode.Logging; 13 using Antmicro.Renode.Peripherals; 14 using Antmicro.Renode.Core.Structure.Registers; 15 16 namespace Antmicro.Renode.Hooks 17 { 18 public class RegisterCollectionHookPythonEngine<T, R> : PythonEngine 19 where T: struct 20 where R: IRegisterCollection 21 { RegisterCollectionHookPythonEngine(IProvidesRegisterCollection<R> registerCollectionProvider, string script)22 public RegisterCollectionHookPythonEngine(IProvidesRegisterCollection<R> registerCollectionProvider, string script) 23 { 24 this.registerCollectionProvider = registerCollectionProvider; 25 this.script = script; 26 27 InnerInit(); 28 Hook = (address, value) => 29 { 30 Scope.SetVariable("address", address); 31 Scope.SetVariable("value", value); 32 Execute(code, error => 33 { 34 Logger.Log(LogLevel.Error, "Python runtime error: {0}", error); 35 }); 36 }; 37 } 38 39 public Action<long, T?> Hook { get; } 40 41 public T? Value => (T?)Scope.GetVariable("value"); 42 43 [PostDeserialization] InnerInit()44 private void InnerInit() 45 { 46 Scope.SetVariable("self", registerCollectionProvider); 47 48 var source = Engine.CreateScriptSourceFromString(script); 49 code = Compile(source); 50 } 51 52 [Transient] 53 private CompiledCode code; 54 55 private readonly string script; 56 private readonly IProvidesRegisterCollection<R> registerCollectionProvider; 57 } 58 } 59 60