esiaccel 0.0.10__cp310-cp310-win_amd64.whl → 0.1.5.dev406__cp310-cp310-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of esiaccel might be problematic. Click here for more details.
- esiaccel/CosimBackend.dll +0 -0
- esiaccel/CosimBackend.lib +0 -0
- esiaccel/ESICppRuntime.dll +0 -0
- esiaccel/ESICppRuntime.lib +0 -0
- esiaccel/EsiCosimDpiServer.dll +0 -0
- esiaccel/EsiCosimDpiServer.lib +0 -0
- esiaccel/MtiPli.dll +0 -0
- esiaccel/MtiPli.lib +0 -0
- esiaccel/__init__.py +10 -1
- esiaccel/abseil_dll.dll +0 -0
- esiaccel/accelerator.py +15 -1
- esiaccel/cares.dll +0 -0
- esiaccel/cmake/esiaccelConfig.cmake +1 -1
- esiaccel/codegen.py +197 -0
- esiaccel/cosim/Cosim_DpiPkg.sv +85 -0
- esiaccel/cosim/Cosim_Endpoint.sv +218 -0
- esiaccel/cosim/Cosim_Manifest.sv +32 -0
- esiaccel/cosim/driver.cpp +131 -0
- esiaccel/cosim/driver.sv +74 -0
- esiaccel/cosim/questa.py +141 -0
- esiaccel/cosim/simulator.py +382 -0
- esiaccel/cosim/verilator.py +92 -0
- esiaccel/esi-cosim.py +104 -0
- esiaccel/esiCppAccel.cp310-win_amd64.pyd +0 -0
- esiaccel/esiquery.exe +0 -0
- esiaccel/include/esi/Accelerator.h +33 -9
- esiaccel/include/esi/CLI.h +77 -0
- esiaccel/include/esi/Common.h +59 -10
- esiaccel/include/esi/Context.h +21 -1
- esiaccel/include/esi/Design.h +14 -3
- esiaccel/include/esi/Engines.h +124 -0
- esiaccel/include/esi/Logging.h +231 -0
- esiaccel/include/esi/Manifest.h +0 -2
- esiaccel/include/esi/Ports.h +54 -7
- esiaccel/include/esi/Services.h +225 -22
- esiaccel/include/esi/Types.h +103 -5
- esiaccel/include/esi/Utils.h +5 -0
- esiaccel/include/esi/Values.h +313 -0
- esiaccel/include/esi/backends/Cosim.h +85 -0
- esiaccel/include/esi/backends/RpcServer.h +55 -0
- esiaccel/include/esi/backends/Trace.h +8 -5
- esiaccel/libcrypto-3-x64.dll +0 -0
- esiaccel/libprotobuf.dll +0 -0
- esiaccel/libssl-3-x64.dll +0 -0
- esiaccel/re2.dll +0 -0
- esiaccel/types.py +174 -33
- esiaccel/utils.py +27 -3
- esiaccel/zlib1.dll +0 -0
- {esiaccel-0.0.10.dist-info → esiaccel-0.1.5.dev406.dist-info}/METADATA +3 -3
- esiaccel-0.1.5.dev406.dist-info/RECORD +54 -0
- {esiaccel-0.0.10.dist-info → esiaccel-0.1.5.dev406.dist-info}/WHEEL +1 -1
- {esiaccel-0.0.10.dist-info → esiaccel-0.1.5.dev406.dist-info}/entry_points.txt +1 -0
- esiaccel/bin/ESICppRuntime.dll +0 -0
- esiaccel/bin/esiquery.exe +0 -0
- esiaccel/bin/zlib1.dll +0 -0
- esiaccel-0.0.10.dist-info/RECORD +0 -28
- {esiaccel-0.0.10.dist-info → esiaccel-0.1.5.dev406.dist-info/licenses}/LICENSE +0 -0
- {esiaccel-0.0.10.dist-info → esiaccel-0.1.5.dev406.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
//===- CLI.h - ESI runtime tool CLI parser common ---------------*- C++ -*-===//
|
|
2
|
+
//
|
|
3
|
+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
4
|
+
// See https://llvm.org/LICENSE.txt for license information.
|
|
5
|
+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
6
|
+
//
|
|
7
|
+
//===----------------------------------------------------------------------===//
|
|
8
|
+
//
|
|
9
|
+
// This file contains the common CLI parser code for ESI runtime tools. Exposed
|
|
10
|
+
// publicly so that out-of-tree tools can use it. This is a header-only library
|
|
11
|
+
// to make compilation easier for out-of-tree tools.
|
|
12
|
+
//
|
|
13
|
+
// DO NOT EDIT!
|
|
14
|
+
// This file is distributed as part of an ESI package. The source for this file
|
|
15
|
+
// should always be modified within CIRCT (lib/dialect/ESI/runtime/cpp).
|
|
16
|
+
//
|
|
17
|
+
//===----------------------------------------------------------------------===//
|
|
18
|
+
|
|
19
|
+
// NOLINTNEXTLINE(llvm-header-guard)
|
|
20
|
+
#ifndef ESI_CLI_H
|
|
21
|
+
#define ESI_CLI_H
|
|
22
|
+
|
|
23
|
+
#include "CLI/CLI.hpp"
|
|
24
|
+
#include "esi/Context.h"
|
|
25
|
+
|
|
26
|
+
namespace esi {
|
|
27
|
+
|
|
28
|
+
/// Common options and code for ESI runtime tools.
|
|
29
|
+
class CliParser : public CLI::App {
|
|
30
|
+
public:
|
|
31
|
+
CliParser(const std::string &toolName)
|
|
32
|
+
: CLI::App(toolName), debug(false), verbose(false) {
|
|
33
|
+
add_option("backend", backend, "Backend to use for connection")->required();
|
|
34
|
+
add_option("connection", connStr,
|
|
35
|
+
"Connection string to use for accelerator communication")
|
|
36
|
+
->required();
|
|
37
|
+
add_flag("--debug", debug, "Enable debug logging");
|
|
38
|
+
#ifdef ESI_RUNTIME_TRACE
|
|
39
|
+
add_flag("--trace", trace, "Enable trace logging");
|
|
40
|
+
#endif
|
|
41
|
+
add_flag("-v,--verbose", verbose, "Enable verbose (info) logging");
|
|
42
|
+
require_subcommand(0, 1);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/// Run the parser.
|
|
46
|
+
int esiParse(int argc, const char **argv) {
|
|
47
|
+
CLI11_PARSE(*this, argc, argv);
|
|
48
|
+
if (trace)
|
|
49
|
+
ctxt = Context::withLogger<ConsoleLogger>(Logger::Level::Trace);
|
|
50
|
+
else if (debug)
|
|
51
|
+
ctxt = Context::withLogger<ConsoleLogger>(Logger::Level::Debug);
|
|
52
|
+
else if (verbose)
|
|
53
|
+
ctxt = Context::withLogger<ConsoleLogger>(Logger::Level::Info);
|
|
54
|
+
return 0;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/// Connect to the accelerator using the specified backend and connection.
|
|
58
|
+
std::unique_ptr<AcceleratorConnection> connect() {
|
|
59
|
+
return ctxt.connect(backend, connStr);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/// Get the context.
|
|
63
|
+
Context &getContext() { return ctxt; }
|
|
64
|
+
|
|
65
|
+
protected:
|
|
66
|
+
Context ctxt;
|
|
67
|
+
|
|
68
|
+
std::string backend;
|
|
69
|
+
std::string connStr;
|
|
70
|
+
bool trace = false;
|
|
71
|
+
bool debug = false;
|
|
72
|
+
bool verbose = false;
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
} // namespace esi
|
|
76
|
+
|
|
77
|
+
#endif // ESI_CLI_H
|
esiaccel/include/esi/Common.h
CHANGED
|
@@ -20,11 +20,13 @@
|
|
|
20
20
|
#include <cstdint>
|
|
21
21
|
#include <map>
|
|
22
22
|
#include <optional>
|
|
23
|
+
#include <span>
|
|
23
24
|
#include <stdexcept>
|
|
24
25
|
#include <string>
|
|
25
26
|
#include <vector>
|
|
26
27
|
|
|
27
28
|
namespace esi {
|
|
29
|
+
class Type;
|
|
28
30
|
|
|
29
31
|
//===----------------------------------------------------------------------===//
|
|
30
32
|
// Common accelerator description types.
|
|
@@ -34,7 +36,6 @@ struct AppID {
|
|
|
34
36
|
std::string name;
|
|
35
37
|
std::optional<uint32_t> idx;
|
|
36
38
|
|
|
37
|
-
AppID(const AppID &) = default;
|
|
38
39
|
AppID(const std::string &name, std::optional<uint32_t> idx = std::nullopt)
|
|
39
40
|
: name(name), idx(idx) {}
|
|
40
41
|
|
|
@@ -42,6 +43,13 @@ struct AppID {
|
|
|
42
43
|
return name == other.name && idx == other.idx;
|
|
43
44
|
}
|
|
44
45
|
bool operator!=(const AppID &other) const { return !(*this == other); }
|
|
46
|
+
friend std::ostream &operator<<(std::ostream &os, const AppID &id);
|
|
47
|
+
|
|
48
|
+
std::string toString() const {
|
|
49
|
+
if (idx.has_value())
|
|
50
|
+
return name + "[" + std::to_string(idx.value()) + "]";
|
|
51
|
+
return name;
|
|
52
|
+
}
|
|
45
53
|
};
|
|
46
54
|
bool operator<(const AppID &a, const AppID &b);
|
|
47
55
|
|
|
@@ -49,18 +57,26 @@ class AppIDPath : public std::vector<AppID> {
|
|
|
49
57
|
public:
|
|
50
58
|
using std::vector<AppID>::vector;
|
|
51
59
|
|
|
52
|
-
AppIDPath operator+(const AppIDPath &b);
|
|
60
|
+
AppIDPath operator+(const AppIDPath &b) const;
|
|
61
|
+
AppIDPath parent() const;
|
|
53
62
|
std::string toStr() const;
|
|
63
|
+
friend std::ostream &operator<<(std::ostream &os, const AppIDPath &path);
|
|
54
64
|
};
|
|
55
65
|
bool operator<(const AppIDPath &a, const AppIDPath &b);
|
|
56
66
|
|
|
67
|
+
struct Constant {
|
|
68
|
+
std::any value;
|
|
69
|
+
std::optional<const Type *> type;
|
|
70
|
+
};
|
|
71
|
+
|
|
57
72
|
struct ModuleInfo {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
73
|
+
std::optional<std::string> name;
|
|
74
|
+
std::optional<std::string> summary;
|
|
75
|
+
std::optional<std::string> version;
|
|
76
|
+
std::optional<std::string> repo;
|
|
77
|
+
std::optional<std::string> commitHash;
|
|
78
|
+
std::map<std::string, Constant> constants;
|
|
79
|
+
std::map<std::string, std::any> extra;
|
|
64
80
|
};
|
|
65
81
|
|
|
66
82
|
/// A description of a service port. Used pretty exclusively in setting up the
|
|
@@ -70,11 +86,22 @@ struct ServicePortDesc {
|
|
|
70
86
|
std::string portName;
|
|
71
87
|
};
|
|
72
88
|
|
|
89
|
+
/// Details about how to connect to a particular channel.
|
|
90
|
+
struct ChannelAssignment {
|
|
91
|
+
/// The name of the type of connection. Typically, the name of the DMA engine
|
|
92
|
+
/// or "cosim" if a cosimulation channel is being used.
|
|
93
|
+
std::string type;
|
|
94
|
+
/// Implementation-specific options.
|
|
95
|
+
std::map<std::string, std::any> implOptions;
|
|
96
|
+
};
|
|
97
|
+
using ChannelAssignments = std::map<std::string, ChannelAssignment>;
|
|
98
|
+
|
|
73
99
|
/// A description of a hardware client. Used pretty exclusively in setting up
|
|
74
100
|
/// the design.
|
|
75
101
|
struct HWClientDetail {
|
|
76
102
|
AppIDPath relPath;
|
|
77
103
|
ServicePortDesc port;
|
|
104
|
+
ChannelAssignments channelAssignments;
|
|
78
105
|
std::map<std::string, std::any> implOptions;
|
|
79
106
|
};
|
|
80
107
|
using HWClientDetails = std::vector<HWClientDetail>;
|
|
@@ -87,13 +114,32 @@ class MessageData {
|
|
|
87
114
|
public:
|
|
88
115
|
/// Adopts the data vector buffer.
|
|
89
116
|
MessageData() = default;
|
|
117
|
+
MessageData(std::span<const uint8_t> data)
|
|
118
|
+
: data(data.data(), data.data() + data.size()) {}
|
|
90
119
|
MessageData(std::vector<uint8_t> &data) : data(std::move(data)) {}
|
|
120
|
+
MessageData(std::vector<uint8_t> &&data) : data(std::move(data)) {}
|
|
91
121
|
MessageData(const uint8_t *data, size_t size) : data(data, data + size) {}
|
|
92
122
|
~MessageData() = default;
|
|
93
123
|
|
|
94
124
|
const uint8_t *getBytes() const { return data.data(); }
|
|
125
|
+
|
|
126
|
+
/// Get the data as a vector of bytes.
|
|
127
|
+
const std::vector<uint8_t> &getData() const { return data; }
|
|
128
|
+
|
|
129
|
+
/// Implicit conversion to a vector/span of bytes, to play nice with other
|
|
130
|
+
/// APIs that accept bytearray-like things.
|
|
131
|
+
operator const std::vector<uint8_t> &() const { return data; }
|
|
132
|
+
operator std::span<const uint8_t>() const { return data; }
|
|
133
|
+
|
|
134
|
+
/// Move the data out of this object.
|
|
135
|
+
std::vector<uint8_t> takeData() { return std::move(data); }
|
|
136
|
+
|
|
95
137
|
/// Get the size of the data in bytes.
|
|
96
138
|
size_t getSize() const { return data.size(); }
|
|
139
|
+
size_t size() const { return getSize(); }
|
|
140
|
+
|
|
141
|
+
/// Returns true if this message contains no data.
|
|
142
|
+
bool empty() const { return data.empty(); }
|
|
97
143
|
|
|
98
144
|
/// Cast to a type. Throws if the size of the data does not match the size of
|
|
99
145
|
/// the message. The lifetime of the resulting pointer is tied to the lifetime
|
|
@@ -113,6 +159,9 @@ public:
|
|
|
113
159
|
return MessageData(reinterpret_cast<const uint8_t *>(&t), sizeof(T));
|
|
114
160
|
}
|
|
115
161
|
|
|
162
|
+
/// Convert the data to a hex string.
|
|
163
|
+
std::string toHex() const;
|
|
164
|
+
|
|
116
165
|
private:
|
|
117
166
|
std::vector<uint8_t> data;
|
|
118
167
|
};
|
|
@@ -120,14 +169,14 @@ private:
|
|
|
120
169
|
} // namespace esi
|
|
121
170
|
|
|
122
171
|
std::ostream &operator<<(std::ostream &, const esi::ModuleInfo &);
|
|
123
|
-
std::ostream &operator<<(std::ostream &, const esi::AppID &);
|
|
124
172
|
|
|
125
173
|
//===----------------------------------------------------------------------===//
|
|
126
174
|
// Functions which should be in the standard library.
|
|
127
175
|
//===----------------------------------------------------------------------===//
|
|
128
176
|
|
|
129
177
|
namespace esi {
|
|
130
|
-
std::string toHex(
|
|
178
|
+
std::string toHex(void *val);
|
|
179
|
+
std::string toHex(uint64_t val);
|
|
131
180
|
} // namespace esi
|
|
132
181
|
|
|
133
182
|
#endif // ESI_COMMON_H
|
esiaccel/include/esi/Context.h
CHANGED
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
#ifndef ESI_CONTEXT_H
|
|
17
17
|
#define ESI_CONTEXT_H
|
|
18
18
|
|
|
19
|
+
#include "esi/Logging.h"
|
|
19
20
|
#include "esi/Types.h"
|
|
20
21
|
|
|
21
22
|
#include <exception>
|
|
@@ -28,8 +29,16 @@ class AcceleratorConnection;
|
|
|
28
29
|
/// AcceleratorConnections, Accelerators, and Manifests must all share a
|
|
29
30
|
/// context. It owns all the types, uniquifying them.
|
|
30
31
|
class Context {
|
|
31
|
-
|
|
32
32
|
public:
|
|
33
|
+
Context() : logger(std::make_unique<ConsoleLogger>(Logger::Level::Warning)) {}
|
|
34
|
+
Context(std::unique_ptr<Logger> logger) : logger(std::move(logger)) {}
|
|
35
|
+
|
|
36
|
+
/// Create a context with a specific logger type.
|
|
37
|
+
template <typename T, typename... Args>
|
|
38
|
+
static Context withLogger(Args &&...args) {
|
|
39
|
+
return Context(std::make_unique<T>(args...));
|
|
40
|
+
}
|
|
41
|
+
|
|
33
42
|
/// Resolve a type id to the type.
|
|
34
43
|
std::optional<const Type *> getType(Type::ID id) const {
|
|
35
44
|
if (auto f = types.find(id); f != types.end())
|
|
@@ -44,6 +53,17 @@ public:
|
|
|
44
53
|
std::unique_ptr<AcceleratorConnection> connect(std::string backend,
|
|
45
54
|
std::string connection);
|
|
46
55
|
|
|
56
|
+
/// Register a logger with the accelerator. Assumes ownership of the logger.
|
|
57
|
+
void setLogger(std::unique_ptr<Logger> logger) {
|
|
58
|
+
if (!logger)
|
|
59
|
+
throw std::invalid_argument("logger must not be null");
|
|
60
|
+
this->logger = std::move(logger);
|
|
61
|
+
}
|
|
62
|
+
inline Logger &getLogger() { return *logger; }
|
|
63
|
+
|
|
64
|
+
private:
|
|
65
|
+
std::unique_ptr<Logger> logger;
|
|
66
|
+
|
|
47
67
|
private:
|
|
48
68
|
using TypeCache = std::map<Type::ID, std::unique_ptr<Type>>;
|
|
49
69
|
TypeCache types;
|
esiaccel/include/esi/Design.h
CHANGED
|
@@ -73,8 +73,10 @@ public:
|
|
|
73
73
|
return ret;
|
|
74
74
|
}
|
|
75
75
|
/// Access the module's ports by ID.
|
|
76
|
-
const std::map<AppID,
|
|
77
|
-
|
|
76
|
+
const std::map<AppID, BundlePort &> &getPorts() const { return portIndex; }
|
|
77
|
+
/// Access the services provided by this module.
|
|
78
|
+
const std::vector<services::Service *> &getServices() const {
|
|
79
|
+
return services;
|
|
78
80
|
}
|
|
79
81
|
|
|
80
82
|
/// Master poll method. Calls the `poll` method on all locally owned ports and
|
|
@@ -82,13 +84,22 @@ public:
|
|
|
82
84
|
/// the `poll` calls returns true.
|
|
83
85
|
bool poll();
|
|
84
86
|
|
|
87
|
+
/// Attempt to resolve a path to a module instance. If a child is not found,
|
|
88
|
+
/// return null and set lastLookup to the path which wasn't found.
|
|
89
|
+
const HWModule *resolveInst(const AppIDPath &path,
|
|
90
|
+
AppIDPath &lastLookup) const;
|
|
91
|
+
|
|
92
|
+
/// Attempt to resolve a path to a port. If a child or port is not found,
|
|
93
|
+
/// return null and set lastLookup to the path which wasn't found.
|
|
94
|
+
BundlePort *resolvePort(const AppIDPath &path, AppIDPath &lastLookup) const;
|
|
95
|
+
|
|
85
96
|
protected:
|
|
86
97
|
const std::optional<ModuleInfo> info;
|
|
87
98
|
const std::vector<std::unique_ptr<Instance>> children;
|
|
88
99
|
const std::map<AppID, Instance *> childIndex;
|
|
89
100
|
const std::vector<services::Service *> services;
|
|
90
101
|
const std::vector<std::unique_ptr<BundlePort>> ports;
|
|
91
|
-
const std::map<AppID,
|
|
102
|
+
const std::map<AppID, BundlePort &> portIndex;
|
|
92
103
|
};
|
|
93
104
|
|
|
94
105
|
/// Subclass of `HWModule` which represents a submodule instance. Adds an AppID,
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
//===- Engines.h - Implement port communication -----------------*- C++ -*-===//
|
|
2
|
+
//
|
|
3
|
+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
4
|
+
// See https://llvm.org/LICENSE.txt for license information.
|
|
5
|
+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
6
|
+
//
|
|
7
|
+
//===----------------------------------------------------------------------===//
|
|
8
|
+
//
|
|
9
|
+
// DO NOT EDIT!
|
|
10
|
+
// This file is distributed as part of an ESI package. The source for this file
|
|
11
|
+
// should always be modified within CIRCT.
|
|
12
|
+
//
|
|
13
|
+
//===----------------------------------------------------------------------===//
|
|
14
|
+
//
|
|
15
|
+
// Engines (as in DMA engine) implement the actual communication between the
|
|
16
|
+
// host and the accelerator. They are low level of the ESI runtime API and are
|
|
17
|
+
// not intended to be used directly by users.
|
|
18
|
+
//
|
|
19
|
+
// They are called "engines" rather than "DMA engines" since communication need
|
|
20
|
+
// not be implemented via DMA.
|
|
21
|
+
//
|
|
22
|
+
//===----------------------------------------------------------------------===//
|
|
23
|
+
|
|
24
|
+
// NOLINTNEXTLINE(llvm-header-guard)
|
|
25
|
+
#ifndef ESI_ENGINGES_H
|
|
26
|
+
#define ESI_ENGINGES_H
|
|
27
|
+
|
|
28
|
+
#include "esi/Common.h"
|
|
29
|
+
#include "esi/Ports.h"
|
|
30
|
+
#include "esi/Services.h"
|
|
31
|
+
#include "esi/Utils.h"
|
|
32
|
+
|
|
33
|
+
#include <cassert>
|
|
34
|
+
#include <future>
|
|
35
|
+
|
|
36
|
+
namespace esi {
|
|
37
|
+
class Accelerator;
|
|
38
|
+
|
|
39
|
+
/// Engines implement the actual channel communication between the host and the
|
|
40
|
+
/// accelerator. Engines can support multiple channels. They are low level of
|
|
41
|
+
/// the ESI runtime API and are not intended to be used directly by users.
|
|
42
|
+
class Engine {
|
|
43
|
+
public:
|
|
44
|
+
Engine(AcceleratorConnection &conn) : connected(false), conn(conn) {}
|
|
45
|
+
virtual ~Engine() = default;
|
|
46
|
+
/// Start the engine, if applicable.
|
|
47
|
+
virtual void connect() { connected = true; };
|
|
48
|
+
/// Stop the engine, if applicable.
|
|
49
|
+
virtual void disconnect() { connected = false; };
|
|
50
|
+
/// Get a port for a channel, from the cache if it exists or create it. An
|
|
51
|
+
/// engine may override this method if different behavior is desired.
|
|
52
|
+
virtual ChannelPort &requestPort(AppIDPath idPath,
|
|
53
|
+
const std::string &channelName,
|
|
54
|
+
BundleType::Direction dir, const Type *type);
|
|
55
|
+
|
|
56
|
+
protected:
|
|
57
|
+
/// Each engine needs to know how to create a ports. This method is called if
|
|
58
|
+
/// a port doesn't exist in the engine cache.
|
|
59
|
+
virtual std::unique_ptr<ChannelPort>
|
|
60
|
+
createPort(AppIDPath idPath, const std::string &channelName,
|
|
61
|
+
BundleType::Direction dir, const Type *type) = 0;
|
|
62
|
+
|
|
63
|
+
bool connected;
|
|
64
|
+
AcceleratorConnection &conn;
|
|
65
|
+
|
|
66
|
+
private:
|
|
67
|
+
std::map<std::pair<AppIDPath, std::string>, std::unique_ptr<ChannelPort>>
|
|
68
|
+
ownedPorts;
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
/// Since engines can support multiple channels BUT not necessarily all of the
|
|
72
|
+
/// channels in a bundle, a mapping from bundle channels to engines is needed.
|
|
73
|
+
class BundleEngineMap {
|
|
74
|
+
friend class AcceleratorConnection;
|
|
75
|
+
|
|
76
|
+
public:
|
|
77
|
+
/// Request ports for all the channels in a bundle. If the engine doesn't
|
|
78
|
+
/// exist for a particular channel, skip said channel.
|
|
79
|
+
PortMap requestPorts(const AppIDPath &idPath,
|
|
80
|
+
const BundleType *bundleType) const;
|
|
81
|
+
|
|
82
|
+
private:
|
|
83
|
+
/// Set a particlar engine for a particular channel. Should only be called by
|
|
84
|
+
/// AcceleratorConnection while registering engines.
|
|
85
|
+
void setEngine(const std::string &channelName, Engine *engine);
|
|
86
|
+
std::map<std::string, Engine *> bundleEngineMap;
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
namespace registry {
|
|
90
|
+
|
|
91
|
+
/// Create an engine by name. This is the primary way to create engines for
|
|
92
|
+
/// "normal" backends.
|
|
93
|
+
std::unique_ptr<Engine> createEngine(AcceleratorConnection &conn,
|
|
94
|
+
const std::string &dmaEngineName,
|
|
95
|
+
AppIDPath idPath,
|
|
96
|
+
const ServiceImplDetails &details,
|
|
97
|
+
const HWClientDetails &clients);
|
|
98
|
+
|
|
99
|
+
namespace internal {
|
|
100
|
+
|
|
101
|
+
/// Engines can register themselves for pluggable functionality.
|
|
102
|
+
using EngineCreate = std::function<std::unique_ptr<Engine>(
|
|
103
|
+
AcceleratorConnection &conn, AppIDPath idPath,
|
|
104
|
+
const ServiceImplDetails &details, const HWClientDetails &clients)>;
|
|
105
|
+
void registerEngine(const std::string &name, EngineCreate create);
|
|
106
|
+
|
|
107
|
+
/// Helper struct to register engines.
|
|
108
|
+
template <typename TEngine>
|
|
109
|
+
struct RegisterEngine {
|
|
110
|
+
RegisterEngine(const char *name) { registerEngine(name, &TEngine::create); }
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
#define CONCAT_(prefix, suffix) prefix##suffix
|
|
114
|
+
#define CONCAT(prefix, suffix) CONCAT_(prefix, suffix)
|
|
115
|
+
#define REGISTER_ENGINE(Name, TEngine) \
|
|
116
|
+
static ::esi::registry::internal::RegisterEngine<TEngine> CONCAT( \
|
|
117
|
+
__register_engine__, __LINE__)(Name)
|
|
118
|
+
|
|
119
|
+
} // namespace internal
|
|
120
|
+
} // namespace registry
|
|
121
|
+
|
|
122
|
+
} // namespace esi
|
|
123
|
+
|
|
124
|
+
#endif // ESI_PORTS_H
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
//===- Logging.h - ESI Runtime logging --------------------------*- C++ -*-===//
|
|
2
|
+
//
|
|
3
|
+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
4
|
+
// See https://llvm.org/LICENSE.txt for license information.
|
|
5
|
+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
6
|
+
//
|
|
7
|
+
//===----------------------------------------------------------------------===//
|
|
8
|
+
//
|
|
9
|
+
// ESI runtime logging is very simple but very flexible. Rather than mandating a
|
|
10
|
+
// particular logging library, it allows users to hook into their existing
|
|
11
|
+
// logging system by implementing a simple interface.
|
|
12
|
+
//
|
|
13
|
+
//===----------------------------------------------------------------------===//
|
|
14
|
+
//
|
|
15
|
+
// DO NOT EDIT!
|
|
16
|
+
// This file is distributed as part of an ESI package. The source for this file
|
|
17
|
+
// should always be modified within CIRCT.
|
|
18
|
+
//
|
|
19
|
+
//===----------------------------------------------------------------------===//
|
|
20
|
+
|
|
21
|
+
// NOLINTNEXTLINE(llvm-header-guard)
|
|
22
|
+
#ifndef ESI_LOGGING_H
|
|
23
|
+
#define ESI_LOGGING_H
|
|
24
|
+
|
|
25
|
+
#include <any>
|
|
26
|
+
#include <functional>
|
|
27
|
+
#include <iosfwd>
|
|
28
|
+
#include <map>
|
|
29
|
+
#include <memory>
|
|
30
|
+
#include <mutex>
|
|
31
|
+
#include <string>
|
|
32
|
+
|
|
33
|
+
namespace esi {
|
|
34
|
+
|
|
35
|
+
class Logger {
|
|
36
|
+
public:
|
|
37
|
+
enum class Level {
|
|
38
|
+
Trace, // Trace is even more detailed than debug and requires a compiler
|
|
39
|
+
// flag to be enabled when the runtime is built. Allows clients to do
|
|
40
|
+
// things like log every single message or interaction.
|
|
41
|
+
Debug, // Information useful when trying to debug an application.
|
|
42
|
+
Info, // General information, like connecting to an accelerator.
|
|
43
|
+
Warning, // May indicate a problem.
|
|
44
|
+
Error, // Many errors will be followed by exceptions which may get caught.
|
|
45
|
+
};
|
|
46
|
+
Logger(bool debugEnabled, bool traceEnabled)
|
|
47
|
+
: debugEnabled(debugEnabled), traceEnabled(traceEnabled) {}
|
|
48
|
+
virtual ~Logger() = default;
|
|
49
|
+
bool getDebugEnabled() { return debugEnabled; }
|
|
50
|
+
bool getTraceEnabled() { return traceEnabled; }
|
|
51
|
+
|
|
52
|
+
/// Report a log message.
|
|
53
|
+
/// Arguments:
|
|
54
|
+
/// level: The log level as defined by the 'Level' enum above.
|
|
55
|
+
/// subsystem: The subsystem that generated the log message.
|
|
56
|
+
/// msg: The log message.
|
|
57
|
+
/// details: Optional additional structured details to include in the log
|
|
58
|
+
/// message. If there are no details, this should be nullptr.
|
|
59
|
+
virtual void
|
|
60
|
+
log(Level level, const std::string &subsystem, const std::string &msg,
|
|
61
|
+
const std::map<std::string, std::any> *details = nullptr) = 0;
|
|
62
|
+
|
|
63
|
+
/// Report an error.
|
|
64
|
+
virtual void error(const std::string &subsystem, const std::string &msg,
|
|
65
|
+
const std::map<std::string, std::any> *details = nullptr) {
|
|
66
|
+
log(Level::Error, subsystem, msg, details);
|
|
67
|
+
}
|
|
68
|
+
/// Report a warning.
|
|
69
|
+
virtual void
|
|
70
|
+
warning(const std::string &subsystem, const std::string &msg,
|
|
71
|
+
const std::map<std::string, std::any> *details = nullptr) {
|
|
72
|
+
log(Level::Warning, subsystem, msg, details);
|
|
73
|
+
}
|
|
74
|
+
/// Report an informational message.
|
|
75
|
+
virtual void info(const std::string &subsystem, const std::string &msg,
|
|
76
|
+
const std::map<std::string, std::any> *details = nullptr) {
|
|
77
|
+
log(Level::Info, subsystem, msg, details);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/// Report a debug message. This is not virtual so that it can be inlined to
|
|
81
|
+
/// minimize performance impact that debug messages have, allowing debug
|
|
82
|
+
/// messages in Release builds.
|
|
83
|
+
inline void debug(const std::string &subsystem, const std::string &msg,
|
|
84
|
+
const std::map<std::string, std::any> *details = nullptr) {
|
|
85
|
+
if (debugEnabled)
|
|
86
|
+
debugImpl(subsystem, msg, details);
|
|
87
|
+
}
|
|
88
|
+
/// Call the debug function callback only if debug is enabled then log a debug
|
|
89
|
+
/// message. Allows users to run heavy weight debug message generation code
|
|
90
|
+
/// only when debug is enabled, which in turns allows users to provide
|
|
91
|
+
/// fully-featured debug messages in Release builds with minimal performance
|
|
92
|
+
/// impact. Not virtual so that it can be inlined.
|
|
93
|
+
inline void
|
|
94
|
+
debug(std::function<
|
|
95
|
+
void(std::string &subsystem, std::string &msg,
|
|
96
|
+
std::unique_ptr<std::map<std::string, std::any>> &details)>
|
|
97
|
+
debugFunc) {
|
|
98
|
+
if (debugEnabled)
|
|
99
|
+
debugImpl(debugFunc);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/// Log a trace message. If tracing is not enabled, this is a no-op. Since it
|
|
103
|
+
/// is inlined, the compiler will hopefully optimize it away creating a
|
|
104
|
+
/// zero-overhead call. This means that clients are free to go crazy with
|
|
105
|
+
/// trace messages.
|
|
106
|
+
inline void trace(const std::string &subsystem, const std::string &msg,
|
|
107
|
+
const std::map<std::string, std::any> *details = nullptr) {
|
|
108
|
+
#ifdef ESI_RUNTIME_TRACE
|
|
109
|
+
if (traceEnabled)
|
|
110
|
+
log(Level::Trace, subsystem, msg, details);
|
|
111
|
+
#endif
|
|
112
|
+
}
|
|
113
|
+
/// Log a trace message using a callback. Same as above, users can go hog-wild
|
|
114
|
+
/// calling this.
|
|
115
|
+
inline void
|
|
116
|
+
trace(std::function<
|
|
117
|
+
void(std::string &subsystem, std::string &msg,
|
|
118
|
+
std::unique_ptr<std::map<std::string, std::any>> &details)>
|
|
119
|
+
traceFunc) {
|
|
120
|
+
#ifdef ESI_RUNTIME_TRACE
|
|
121
|
+
if (!traceEnabled)
|
|
122
|
+
return;
|
|
123
|
+
std::string subsystem;
|
|
124
|
+
std::string msg;
|
|
125
|
+
std::unique_ptr<std::map<std::string, std::any>> details = nullptr;
|
|
126
|
+
traceFunc(subsystem, msg, details);
|
|
127
|
+
log(Level::Trace, subsystem, msg, details.get());
|
|
128
|
+
#endif
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
protected:
|
|
132
|
+
/// Overrideable version of debug. Only gets called if debug is enabled.
|
|
133
|
+
virtual void debugImpl(const std::string &subsystem, const std::string &msg,
|
|
134
|
+
const std::map<std::string, std::any> *details) {
|
|
135
|
+
log(Level::Debug, subsystem, msg, details);
|
|
136
|
+
}
|
|
137
|
+
/// Overrideable version of debug. Only gets called if debug is enabled.
|
|
138
|
+
virtual void
|
|
139
|
+
debugImpl(std::function<
|
|
140
|
+
void(std::string &subsystem, std::string &msg,
|
|
141
|
+
std::unique_ptr<std::map<std::string, std::any>> &details)>
|
|
142
|
+
debugFunc) {
|
|
143
|
+
if (!debugEnabled)
|
|
144
|
+
return;
|
|
145
|
+
std::string subsystem;
|
|
146
|
+
std::string msg;
|
|
147
|
+
std::unique_ptr<std::map<std::string, std::any>> details = nullptr;
|
|
148
|
+
debugFunc(subsystem, msg, details);
|
|
149
|
+
debugImpl(subsystem, msg, details.get());
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/// Enable or disable debug messages.
|
|
153
|
+
bool debugEnabled = false;
|
|
154
|
+
|
|
155
|
+
/// Enable or disable trace messages.
|
|
156
|
+
bool traceEnabled;
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
/// A thread-safe logger which calls functions implemented by subclasses. Only
|
|
160
|
+
/// protects the `log` method. If subclasses override other methods and need to
|
|
161
|
+
/// protect them, they need to do that themselves.
|
|
162
|
+
class TSLogger : public Logger {
|
|
163
|
+
public:
|
|
164
|
+
using Logger::Logger;
|
|
165
|
+
|
|
166
|
+
/// Grabs the lock and calls logImpl.
|
|
167
|
+
void log(Level level, const std::string &subsystem, const std::string &msg,
|
|
168
|
+
const std::map<std::string, std::any> *details) override final;
|
|
169
|
+
|
|
170
|
+
protected:
|
|
171
|
+
/// Subclasses must implement this method to log messages.
|
|
172
|
+
virtual void logImpl(Level level, const std::string &subsystem,
|
|
173
|
+
const std::string &msg,
|
|
174
|
+
const std::map<std::string, std::any> *details) = 0;
|
|
175
|
+
|
|
176
|
+
/// Mutex to protect the stream from interleaved logging writes.
|
|
177
|
+
std::mutex mutex;
|
|
178
|
+
};
|
|
179
|
+
|
|
180
|
+
/// A logger that writes to a C++ std::ostream.
|
|
181
|
+
class StreamLogger : public TSLogger {
|
|
182
|
+
public:
|
|
183
|
+
/// Create a stream logger that logs to the given output stream and error
|
|
184
|
+
/// output stream.
|
|
185
|
+
StreamLogger(Level minLevel, std::ostream &out, std::ostream &error)
|
|
186
|
+
: TSLogger(minLevel <= Level::Debug, minLevel <= Level::Trace),
|
|
187
|
+
minLevel(minLevel), outStream(out), errorStream(error) {}
|
|
188
|
+
/// Create a stream logger that logs to stdout, stderr.
|
|
189
|
+
StreamLogger(Level minLevel);
|
|
190
|
+
void logImpl(Level level, const std::string &subsystem,
|
|
191
|
+
const std::string &msg,
|
|
192
|
+
const std::map<std::string, std::any> *details) override;
|
|
193
|
+
|
|
194
|
+
private:
|
|
195
|
+
/// The minimum log level to emit.
|
|
196
|
+
Level minLevel;
|
|
197
|
+
|
|
198
|
+
/// Everything except errors goes here.
|
|
199
|
+
std::ostream &outStream;
|
|
200
|
+
/// Just for errors.
|
|
201
|
+
std::ostream &errorStream;
|
|
202
|
+
};
|
|
203
|
+
|
|
204
|
+
/// A logger that writes to the console. Includes color support.
|
|
205
|
+
class ConsoleLogger : public TSLogger {
|
|
206
|
+
public:
|
|
207
|
+
/// Create a stream logger that logs to stdout, stderr.
|
|
208
|
+
ConsoleLogger(Level minLevel);
|
|
209
|
+
void logImpl(Level level, const std::string &subsystem,
|
|
210
|
+
const std::string &msg,
|
|
211
|
+
const std::map<std::string, std::any> *details) override;
|
|
212
|
+
|
|
213
|
+
private:
|
|
214
|
+
/// The minimum log level to emit.
|
|
215
|
+
Level minLevel;
|
|
216
|
+
};
|
|
217
|
+
|
|
218
|
+
/// A logger that does nothing.
|
|
219
|
+
class NullLogger : public Logger {
|
|
220
|
+
public:
|
|
221
|
+
NullLogger() : Logger(false, false) {}
|
|
222
|
+
void log(Level, const std::string &, const std::string &,
|
|
223
|
+
const std::map<std::string, std::any> *) override {}
|
|
224
|
+
};
|
|
225
|
+
|
|
226
|
+
/// 'Stringify' a std::any. This is used to log std::any values by some loggers.
|
|
227
|
+
std::string toString(const std::any &a);
|
|
228
|
+
|
|
229
|
+
} // namespace esi
|
|
230
|
+
|
|
231
|
+
#endif // ESI_LOGGING_H
|
esiaccel/include/esi/Manifest.h
CHANGED
|
@@ -65,8 +65,6 @@ private:
|
|
|
65
65
|
|
|
66
66
|
} // namespace esi
|
|
67
67
|
|
|
68
|
-
std::ostream &operator<<(std::ostream &os, const esi::AppID &id);
|
|
69
|
-
std::ostream &operator<<(std::ostream &, const esi::AppIDPath &);
|
|
70
68
|
std::ostream &operator<<(std::ostream &, const esi::ModuleInfo &);
|
|
71
69
|
|
|
72
70
|
#endif // ESI_MANIFEST_H
|