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