1 // 2 // Copyright (c) 2010-2025 Antmicro 3 // 4 // This file is licensed under the MIT License. 5 // Full license text is available in 'licenses/MIT.txt'. 6 // 7 #ifndef RENODE_BUS_H 8 #define RENODE_BUS_H 9 #include <memory> 10 #include <vector> 11 12 #include "../../../../Infrastructure/src/Emulator/Cores/renode/include/renode_imports.h" 13 #include "src/renode.h" 14 #include "src/buses/bus.h" 15 #include "src/communication/communication_channel.h" 16 17 class BaseBus; 18 class BaseInitiatorBus; 19 class BaseTargetBus; 20 class RenodeAgent; 21 struct Protocol; 22 23 extern RenodeAgent* Init(); //definition has to be provided in sim_main.cpp of cosimulated peripheral 24 25 extern "C" 26 { 27 void initialize_native(); 28 void handle_request(Protocol* request); 29 void reset_peripheral(); 30 } 31 32 class RenodeAgent 33 { 34 public: 35 RenodeAgent(); 36 virtual void addBus(BaseInitiatorBus* bus); 37 virtual void addBus(BaseTargetBus* bus); 38 virtual void writeToBus(int width, uint64_t addr, uint64_t value); 39 virtual void readFromBus(int width, uint64_t addr); 40 virtual void pushByteToAgent(uint64_t addr, uint8_t value); 41 virtual void pushWordToAgent(uint64_t addr, uint16_t value); 42 virtual void pushDoubleWordToAgent(uint64_t addr, uint32_t value); 43 virtual uint64_t requestDoubleWordFromAgent(uint64_t addr); 44 virtual void pushToAgent(Action action, uint64_t addr, uint64_t value); 45 virtual uint64_t requestFromAgent(Action action, uint64_t addr); 46 virtual void tick(bool countEnable, uint64_t steps); 47 virtual void timeoutTick(uint8_t* signal, uint8_t expectedValue, int timeout = 2000); 48 virtual void reset(); 49 virtual void fatalError(); 50 virtual void handleCustomRequestType(Protocol* message); 51 virtual void log(int level, const char* fmt, ...); 52 virtual struct Protocol* receive(); 53 virtual void registerInterrupt(uint8_t *irq, uint8_t irq_addr); 54 virtual void handleInterrupts(void); 55 virtual void connect(int receiverPort, int senderPort, const char* address); 56 virtual void connectNative(); 57 virtual void simulate(); 58 virtual void handleRequest(Protocol* request); 59 60 std::vector<std::unique_ptr<BaseTargetBus>> targetInterfaces; 61 std::vector<std::unique_ptr<BaseInitiatorBus>> initatorInterfaces; 62 63 protected: 64 void addBus(BaseBus* bus); 65 struct Interrupt { 66 uint8_t* irq; 67 uint8_t prev_irq; 68 uint8_t irq_addr; 69 }; 70 71 std::vector<Interrupt> interrupts; 72 CommunicationChannel* communicationChannel; 73 BaseBus* firstInterface; 74 75 private: 76 void handleDisconnect(); 77 friend void ::handle_request(Protocol* request); 78 friend void ::initialize_native(void); 79 friend void ::reset_peripheral(void); 80 }; 81 82 class NativeCommunicationChannel : public CommunicationChannel 83 { 84 public: 85 NativeCommunicationChannel() = default; 86 void sendMain(const Protocol message) override; 87 void sendSender(const Protocol message) override; 88 void log(int logLevel, const char* data) override; 89 Protocol* receive() override; 90 bool isConnected() override; 91 }; 92 93 #endif 94