From 2c75142cb838eb6d27c6f0188615a7336148d038 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20L=C3=BCke?= Date: Tue, 17 Dec 2024 18:19:31 +0100 Subject: [PATCH 01/19] move dev tools into tools/ --- src/CMakeLists.txt | 28 +----------------- src/pipeline.h | 14 --------- src/thread_name.cc | 22 -------------- src/thread_name.h | 9 ------ src/tools/CMakeLists.txt | 29 +++++++++++++++++++ src/{ => tools}/mesy_nng_pipeline_main.cc | 0 src/{ => tools}/mesy_nng_pub_producer.cc | 0 src/{ => tools}/mesy_nng_push_pull_main.cc | 0 src/{ => tools}/mesy_nng_sub_consumer.cc | 0 src/{ => tools}/mnode_proto_ping_client.cc | 0 src/{ => tools}/mnode_proto_ping_server.cc | 0 .../mnode_proto_rpc_ping_client.cc | 0 .../mnode_proto_rpc_ping_server.cc | 0 src/{ => tools}/mnode_proto_test1.cc | 0 src/{ => tools}/mvlc_nng_replay.cc | 0 src/{ => tools}/pair_consumer.cc | 0 src/{ => tools}/pair_inproc.cc | 2 +- src/{ => tools}/pair_producer.cc | 0 src/{ => tools}/test_producer_consumer.h | 0 19 files changed, 31 insertions(+), 73 deletions(-) delete mode 100644 src/pipeline.h delete mode 100644 src/thread_name.cc delete mode 100644 src/thread_name.h create mode 100644 src/tools/CMakeLists.txt rename src/{ => tools}/mesy_nng_pipeline_main.cc (100%) rename src/{ => tools}/mesy_nng_pub_producer.cc (100%) rename src/{ => tools}/mesy_nng_push_pull_main.cc (100%) rename src/{ => tools}/mesy_nng_sub_consumer.cc (100%) rename src/{ => tools}/mnode_proto_ping_client.cc (100%) rename src/{ => tools}/mnode_proto_ping_server.cc (100%) rename src/{ => tools}/mnode_proto_rpc_ping_client.cc (100%) rename src/{ => tools}/mnode_proto_rpc_ping_server.cc (100%) rename src/{ => tools}/mnode_proto_test1.cc (100%) rename src/{ => tools}/mvlc_nng_replay.cc (100%) rename src/{ => tools}/pair_consumer.cc (100%) rename src/{ => tools}/pair_inproc.cc (96%) rename src/{ => tools}/pair_producer.cc (100%) rename src/{ => tools}/test_producer_consumer.h (100%) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 6a7230d..38d7076 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -13,34 +13,8 @@ target_include_directories(mesytec-mnode target_link_libraries(mesytec-mnode PUBLIC nng mnode-proto PRIVATE spdlog) target_compile_features(mesytec-mnode PRIVATE cxx_std_17) -add_library(mesytec-mnode-dev INTERFACE) -target_link_libraries(mesytec-mnode-dev INTERFACE mesytec-mnode mesytec-mvlc) +add_subdirectory(tools) -function(add_mnode_dev_executable name) - add_executable(${name} ${name}.cc) - target_link_libraries(${name} PRIVATE mesytec-mnode-dev) - target_compile_options(${name} PRIVATE ${MVLC_NNG_MNODE_WARN_FLAGS}) -endfunction() - -function(add_mnode_proto_dev_executable name) - add_mnode_dev_executable(${name}) - target_link_libraries(${name} PRIVATE mnode-proto mesytec-mvlc) -endfunction() - -add_mnode_dev_executable(pair_producer) -add_mnode_dev_executable(pair_consumer) -add_mnode_dev_executable(pair_inproc) -add_mnode_dev_executable(mvlc_nng_replay) -add_mnode_dev_executable(mesy_nng_pipeline_main) -add_mnode_dev_executable(mesy_nng_push_pull_main) -add_mnode_dev_executable(mesy_nng_pub_producer) -add_mnode_dev_executable(mesy_nng_sub_consumer) - -add_mnode_proto_dev_executable(mnode_proto_test1) -add_mnode_proto_dev_executable(mnode_proto_ping_client) -add_mnode_proto_dev_executable(mnode_proto_ping_server) -add_mnode_proto_dev_executable(mnode_proto_rpc_ping_server) -add_mnode_proto_dev_executable(mnode_proto_rpc_ping_client) #add_subdirectory(qt) diff --git a/src/pipeline.h b/src/pipeline.h deleted file mode 100644 index f51444b..0000000 --- a/src/pipeline.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef CF3DAF23_18D2_419E_9DCC_3855C5A63226 -#define CF3DAF23_18D2_419E_9DCC_3855C5A63226 - -#include - -namespace mesytec::mnode::pipeline -{ - - - - -} - -#endif /* CF3DAF23_18D2_419E_9DCC_3855C5A63226 */ diff --git a/src/thread_name.cc b/src/thread_name.cc deleted file mode 100644 index 005e237..0000000 --- a/src/thread_name.cc +++ /dev/null @@ -1,22 +0,0 @@ -#include "thread_name.h" -#ifdef __linux__ -#include -#endif - -namespace mesytec::util -{ - -#ifdef __linux__ -void set_thread_name(const char *name) -{ - prctl(PR_SET_NAME,name,0,0,0); -} - -#else - -void set_thread_name(const char *) -{ -} - -#endif -} diff --git a/src/thread_name.h b/src/thread_name.h deleted file mode 100644 index 0500f27..0000000 --- a/src/thread_name.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef CAF8B988_F0C9_475A_8E38_8789949859DB -#define CAF8B988_F0C9_475A_8E38_8789949859DB - -namespace mesytec::util -{ -void set_thread_name(const char *name); -} - -#endif /* CAF8B988_F0C9_475A_8E38_8789949859DB */ diff --git a/src/tools/CMakeLists.txt b/src/tools/CMakeLists.txt new file mode 100644 index 0000000..20a8162 --- /dev/null +++ b/src/tools/CMakeLists.txt @@ -0,0 +1,29 @@ +add_library(mesytec-mnode-dev INTERFACE) +target_link_libraries(mesytec-mnode-dev INTERFACE mesytec-mnode mesytec-mvlc) +target_include_directories(mesytec-mnode-dev INTERFACE $) + +function(add_mnode_dev_executable name) + add_executable(${name} ${name}.cc) + target_link_libraries(${name} PRIVATE mesytec-mnode-dev) + target_compile_options(${name} PRIVATE ${MVLC_NNG_MNODE_WARN_FLAGS}) +endfunction() + +function(add_mnode_proto_dev_executable name) + add_mnode_dev_executable(${name}) + target_link_libraries(${name} PRIVATE mnode-proto mesytec-mvlc) +endfunction() + +add_mnode_dev_executable(pair_producer) +add_mnode_dev_executable(pair_consumer) +add_mnode_dev_executable(pair_inproc) +add_mnode_dev_executable(mvlc_nng_replay) +add_mnode_dev_executable(mesy_nng_pipeline_main) +add_mnode_dev_executable(mesy_nng_push_pull_main) +add_mnode_dev_executable(mesy_nng_pub_producer) +add_mnode_dev_executable(mesy_nng_sub_consumer) + +add_mnode_proto_dev_executable(mnode_proto_test1) +add_mnode_proto_dev_executable(mnode_proto_ping_client) +add_mnode_proto_dev_executable(mnode_proto_ping_server) +add_mnode_proto_dev_executable(mnode_proto_rpc_ping_server) +add_mnode_proto_dev_executable(mnode_proto_rpc_ping_client) diff --git a/src/mesy_nng_pipeline_main.cc b/src/tools/mesy_nng_pipeline_main.cc similarity index 100% rename from src/mesy_nng_pipeline_main.cc rename to src/tools/mesy_nng_pipeline_main.cc diff --git a/src/mesy_nng_pub_producer.cc b/src/tools/mesy_nng_pub_producer.cc similarity index 100% rename from src/mesy_nng_pub_producer.cc rename to src/tools/mesy_nng_pub_producer.cc diff --git a/src/mesy_nng_push_pull_main.cc b/src/tools/mesy_nng_push_pull_main.cc similarity index 100% rename from src/mesy_nng_push_pull_main.cc rename to src/tools/mesy_nng_push_pull_main.cc diff --git a/src/mesy_nng_sub_consumer.cc b/src/tools/mesy_nng_sub_consumer.cc similarity index 100% rename from src/mesy_nng_sub_consumer.cc rename to src/tools/mesy_nng_sub_consumer.cc diff --git a/src/mnode_proto_ping_client.cc b/src/tools/mnode_proto_ping_client.cc similarity index 100% rename from src/mnode_proto_ping_client.cc rename to src/tools/mnode_proto_ping_client.cc diff --git a/src/mnode_proto_ping_server.cc b/src/tools/mnode_proto_ping_server.cc similarity index 100% rename from src/mnode_proto_ping_server.cc rename to src/tools/mnode_proto_ping_server.cc diff --git a/src/mnode_proto_rpc_ping_client.cc b/src/tools/mnode_proto_rpc_ping_client.cc similarity index 100% rename from src/mnode_proto_rpc_ping_client.cc rename to src/tools/mnode_proto_rpc_ping_client.cc diff --git a/src/mnode_proto_rpc_ping_server.cc b/src/tools/mnode_proto_rpc_ping_server.cc similarity index 100% rename from src/mnode_proto_rpc_ping_server.cc rename to src/tools/mnode_proto_rpc_ping_server.cc diff --git a/src/mnode_proto_test1.cc b/src/tools/mnode_proto_test1.cc similarity index 100% rename from src/mnode_proto_test1.cc rename to src/tools/mnode_proto_test1.cc diff --git a/src/mvlc_nng_replay.cc b/src/tools/mvlc_nng_replay.cc similarity index 100% rename from src/mvlc_nng_replay.cc rename to src/tools/mvlc_nng_replay.cc diff --git a/src/pair_consumer.cc b/src/tools/pair_consumer.cc similarity index 100% rename from src/pair_consumer.cc rename to src/tools/pair_consumer.cc diff --git a/src/pair_inproc.cc b/src/tools/pair_inproc.cc similarity index 96% rename from src/pair_inproc.cc rename to src/tools/pair_inproc.cc index c30daee..7046cf9 100644 --- a/src/pair_inproc.cc +++ b/src/tools/pair_inproc.cc @@ -2,7 +2,7 @@ #include -int main(int argc, char *argv[]) +int main() { spdlog::set_level(spdlog::level::info); auto producerSocket = make_pair_socket(); diff --git a/src/pair_producer.cc b/src/tools/pair_producer.cc similarity index 100% rename from src/pair_producer.cc rename to src/tools/pair_producer.cc diff --git a/src/test_producer_consumer.h b/src/tools/test_producer_consumer.h similarity index 100% rename from src/test_producer_consumer.h rename to src/tools/test_producer_consumer.h From 728bad6841201a63cff65962b465c4534bfb3301 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20L=C3=BCke?= Date: Tue, 17 Dec 2024 23:27:48 +0100 Subject: [PATCH 02/19] possible low level mvlc proto interface --- external/mesytec-mvlc | 2 +- include/mesytec-mnode/mnode_nng_async.h | 8 +-- proto/mvlc.proto | 64 ++++++++++++++++++++++++ proto/vme.proto | 2 +- src/tools/mnode_proto_rpc_ping_server.cc | 63 ++++------------------- 5 files changed, 79 insertions(+), 60 deletions(-) diff --git a/external/mesytec-mvlc b/external/mesytec-mvlc index 3347a18..51cf605 160000 --- a/external/mesytec-mvlc +++ b/external/mesytec-mvlc @@ -1 +1 @@ -Subproject commit 3347a186c7c3eb0a12b6baa76b90e71d573fcd39 +Subproject commit 51cf6051d87a52984fe7a8feaf6f3516be5358cd diff --git a/include/mesytec-mnode/mnode_nng_async.h b/include/mesytec-mnode/mnode_nng_async.h index ac0c04d..da76411 100644 --- a/include/mesytec-mnode/mnode_nng_async.h +++ b/include/mesytec-mnode/mnode_nng_async.h @@ -12,18 +12,18 @@ struct IWork virtual void work() = 0; }; -struct IAsyncReqWork: public IWork +struct IReqWork: public IWork { virtual nng::unique_msg make_request() = 0; virtual void handle_reply(nng::unique_msg &&request, nng::unique_msg &&reply) = 0; }; -struct IAsyncRepWork: public IWork +struct IRepWork: public IWork { virtual nng::unique_msg handle_request(nng::unique_msg &&request) = 0; }; -class AsyncReqWork: public IAsyncReqWork +class AsyncReqWork: public IReqWork { public: explicit AsyncReqWork(nng_socket socket); @@ -39,7 +39,7 @@ class AsyncReqWork: public IAsyncReqWork nng::unique_msg request_; }; -class AsyncRepWork: public IAsyncRepWork +class AsyncRepWork: public IRepWork { public: explicit AsyncRepWork(nng_socket socket); diff --git a/proto/mvlc.proto b/proto/mvlc.proto index 4f2120f..395084c 100644 --- a/proto/mvlc.proto +++ b/proto/mvlc.proto @@ -29,8 +29,72 @@ message ReadRegisterResponse optional google.rpc.Status status = 2; } +message Buffer +{ + repeated uint32 data = 1; +} + +message LowLevelRequest +{ + Buffer contents = 1; +} + +message LowLevelResponse +{ + Buffer contents = 1; +} + +message CommandRequest +{ + Buffer contents = 1; +}; + +message CommandResponse +{ + Buffer contents = 1; +}; + +enum Pipe +{ + Command = 0; + Data = 1; +} + +message WriteRequest +{ + Pipe pipe = 1; + bytes data = 2; +} + +message WriteResponse +{ + google.rpc.Status status = 1; + uint32 bytes_written = 2; +} + +message ReadRequest +{ + Pipe pipe = 1; + uint32 bytes_to_read = 2; +} + +message ReadResponse +{ + google.rpc.Status status = 1; + bytes data = 2; +} + +service MvlcCoreService +{ + rpc Write(WriteRequest) returns (WriteResponse); + rpc Read(ReadRequest) returns (ReadResponse); +} + service MVLCService { + rpc LowLevelTransaction(LowLevelRequest) returns (LowLevelResponse); + rpc CommandTransaction(CommandRequest) returns (CommandResponse); + rpc ReadRegister(ReadRegisterRequest) returns (ReadRegisterResponse); rpc WriteRegister(WriteRegisterRequest) returns (WriteRegisterResponse); rpc VMERead(mesytec.mnode.proto.vme.ReadRequest) returns (mesytec.mnode.proto.vme.ReadResponse); diff --git a/proto/vme.proto b/proto/vme.proto index e67ea72..e8e3f59 100644 --- a/proto/vme.proto +++ b/proto/vme.proto @@ -60,7 +60,7 @@ enum ResponseFlags message ReadResponse { - repeated uint32 value = 1; + repeated uint32 values = 1; optional ResponseFlags flags = 2; optional google.rpc.Status status = 3; } diff --git a/src/tools/mnode_proto_rpc_ping_server.cc b/src/tools/mnode_proto_rpc_ping_server.cc index 5dfe487..dbb3fe3 100644 --- a/src/tools/mnode_proto_rpc_ping_server.cc +++ b/src/tools/mnode_proto_rpc_ping_server.cc @@ -27,13 +27,13 @@ class MVLCService: public mnode::proto::mvlc::MVLCService mnode::proto::mvlc::ReadRegisterResponse *response, ::google::protobuf::Closure *done) override { + (void)controller; spdlog::info("MVLCService::ReadRegister"); u32 value; if (auto ec = mvlc_.readRegister(request->address(), value)) { response->mutable_status()->set_code(ec.value()); response->mutable_status()->set_message(ec.message()); - controller->SetFailed(ec.message()); } else { @@ -62,14 +62,14 @@ class MVLCService: public mnode::proto::mvlc::MVLCService ec = mvlc_.vmeBlockRead(request->address(), amod, maxTransfers, dest, fifo); for (auto d: dest) { - response->add_value(d); + response->add_values(d); } } else { u32 dest = 0; ec = mvlc_.vmeRead(request->address(), dest, amod, data_width); - response->add_value(dest); + response->add_values(dest); } done->Run(); @@ -102,64 +102,19 @@ struct RpcClosure: public google::protobuf::Closure struct RpcController: public google::protobuf::RpcController { - void Reset() override { spdlog::debug("RpcController::Reset"); } + // Client-side methods --------------------------------------------- + void Reset() override {} bool Failed() const override { return false; } - std::string ErrorText() const override { return ""; } + std::string ErrorText() const override { return {}; } void StartCancel() override {} - void SetFailed(const std::string &reason) override - { - spdlog::error("RpcController::SetFailed: reason={}", reason); - } + + // Server-side methods --------------------------------------------- + void SetFailed(const std::string &) override { assert(!"SetFailed not implemented"); } bool IsCanceled() const override { return false; } void NotifyOnCancel(google::protobuf::Closure * /*callback*/) override {} }; -struct RpcChannel: public google::protobuf::RpcChannel -{ - void CallMethod(const google::protobuf::MethodDescriptor *method, - google::protobuf::RpcController *controller, - const google::protobuf::Message *request, google::protobuf::Message *response, - google::protobuf::Closure *done) override - { - spdlog::info("RpcChannel::CallMethod: method={}, request={}, response={}", - method->full_name(), request->ShortDebugString(), response->GetTypeName()); - } -}; - -bool serialize_proto_to_nng(const google::protobuf::MessageLite &message, nng_msg *msg) -{ - auto messageSize = message.ByteSizeLong(); - - if (auto res = nng_msg_realloc(msg, nng_msg_len(msg) + sizeof(u32) + messageSize); res != 0) - { - spdlog::error("nng_msg_realloc: {}", nng_strerror(res)); - return false; - } - - *reinterpret_cast(nng_msg_body(msg)) = messageSize; - return message.SerializeToArray(reinterpret_cast(nng_msg_body(msg)) + sizeof(u32), - messageSize); -} - -bool deserialize_proto_from_nng(google::protobuf::MessageLite &message, nng_msg *msg) -{ - auto messageSize = mnode::nng::msg_trim_read(msg); - - if (!messageSize) - return false; - - if (nng_msg_len(msg) < *messageSize) - { - spdlog::error("message too short"); - return false; - } - - bool ret = message.ParseFromArray(reinterpret_cast(nng_msg_body(msg)), *messageSize); - nng_msg_trim(msg, *messageSize); - return ret; -} - struct RPCServer { explicit RPCServer(nng_socket socket) From 8a3fc0ed1d59958ea92807ab03d49f294c433fe0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20L=C3=BCke?= Date: Sat, 21 Dec 2024 01:29:39 +0100 Subject: [PATCH 03/19] initial dump of data from the mvme templates --- assets/vme_base_configs.json | 2821 +++++++++++++++++++++++++++ assets/vme_module_data_sources.json | 412 ++++ 2 files changed, 3233 insertions(+) create mode 100644 assets/vme_base_configs.json create mode 100644 assets/vme_module_data_sources.json diff --git a/assets/vme_base_configs.json b/assets/vme_base_configs.json new file mode 100644 index 0000000..9392576 --- /dev/null +++ b/assets/vme_base_configs.json @@ -0,0 +1,2821 @@ +{ + "crateconfig": { + "crate": { + "crateId": "0x0", + "init_commands": { + "groups": null, + "name": "init_commands" + }, + "init_registers": null, + "init_trigger_io": { + "groups": [ + { + "contents": [ + "vme_write 0x09 d16 0xffff0200 0x00000000", + "vme_write 0x09 d16 0xffff0302 0x00000000", + "vme_write 0x09 d16 0xffff0304 0x00000000", + "vme_write 0x09 d16 0xffff0306 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x00000001", + "vme_write 0x09 d16 0xffff0302 0x00000000", + "vme_write 0x09 d16 0xffff0304 0x00000000", + "vme_write 0x09 d16 0xffff0306 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x00000002", + "vme_write 0x09 d16 0xffff0302 0x00000000", + "vme_write 0x09 d16 0xffff0304 0x00000000", + "vme_write 0x09 d16 0xffff0306 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x00000003", + "vme_write 0x09 d16 0xffff0302 0x00000000", + "vme_write 0x09 d16 0xffff0304 0x00000000", + "vme_write 0x09 d16 0xffff0306 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x00000004", + "vme_write 0x09 d16 0xffff0380 0x00000000", + "vme_write 0x09 d16 0xffff0300 0x00000000", + "vme_write 0x09 d16 0xffff0306 0x00000000", + "vme_write 0x09 d16 0xffff0308 0x00000000", + "vme_write 0x09 d16 0xffff030a 0x00000000", + "vme_write 0x09 d16 0xffff030c 0x00000000", + "vme_write 0x09 d16 0xffff0382 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x00000005", + "vme_write 0x09 d16 0xffff0380 0x00000000", + "vme_write 0x09 d16 0xffff0300 0x00000000", + "vme_write 0x09 d16 0xffff0306 0x00000000", + "vme_write 0x09 d16 0xffff0308 0x00000000", + "vme_write 0x09 d16 0xffff030a 0x00000000", + "vme_write 0x09 d16 0xffff030c 0x00000000", + "vme_write 0x09 d16 0xffff0382 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x00000006", + "vme_write 0x09 d16 0xffff0380 0x00000000", + "vme_write 0x09 d16 0xffff0300 0x00000000", + "vme_write 0x09 d16 0xffff0306 0x00000000", + "vme_write 0x09 d16 0xffff0308 0x00000000", + "vme_write 0x09 d16 0xffff030a 0x00000000", + "vme_write 0x09 d16 0xffff030c 0x00000000", + "vme_write 0x09 d16 0xffff0382 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x00000007", + "vme_write 0x09 d16 0xffff0380 0x00000000", + "vme_write 0x09 d16 0xffff0300 0x00000000", + "vme_write 0x09 d16 0xffff0306 0x00000000", + "vme_write 0x09 d16 0xffff0308 0x00000000", + "vme_write 0x09 d16 0xffff030a 0x00000000", + "vme_write 0x09 d16 0xffff030c 0x00000000", + "vme_write 0x09 d16 0xffff0382 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x00000008", + "vme_write 0x09 d16 0xffff0380 0x00000000", + "vme_write 0x09 d16 0xffff0300 0x00000000", + "vme_write 0x09 d16 0xffff0306 0x00000000", + "vme_write 0x09 d16 0xffff0308 0x00000000", + "vme_write 0x09 d16 0xffff030a 0x00000000", + "vme_write 0x09 d16 0xffff030c 0x00000000", + "vme_write 0x09 d16 0xffff0382 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x00000009", + "vme_write 0x09 d16 0xffff0380 0x00000000", + "vme_write 0x09 d16 0xffff0300 0x00000000", + "vme_write 0x09 d16 0xffff0306 0x00000000", + "vme_write 0x09 d16 0xffff0308 0x00000000", + "vme_write 0x09 d16 0xffff030a 0x00000000", + "vme_write 0x09 d16 0xffff030c 0x00000000", + "vme_write 0x09 d16 0xffff0382 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x0000000a", + "vme_write 0x09 d16 0xffff0380 0x00000000", + "vme_write 0x09 d16 0xffff0300 0x00000000", + "vme_write 0x09 d16 0xffff0306 0x00000000", + "vme_write 0x09 d16 0xffff0308 0x00000000", + "vme_write 0x09 d16 0xffff030a 0x00000000", + "vme_write 0x09 d16 0xffff030c 0x00000000", + "vme_write 0x09 d16 0xffff0382 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x0000000b", + "vme_write 0x09 d16 0xffff0380 0x00000000", + "vme_write 0x09 d16 0xffff0300 0x00000000", + "vme_write 0x09 d16 0xffff0306 0x00000000", + "vme_write 0x09 d16 0xffff0308 0x00000000", + "vme_write 0x09 d16 0xffff030a 0x00000000", + "vme_write 0x09 d16 0xffff030c 0x00000000", + "vme_write 0x09 d16 0xffff0382 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x0000000c", + "vme_write 0x09 d16 0xffff0300 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x0000000d", + "vme_write 0x09 d16 0xffff0300 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x00000010", + "vme_write 0x09 d16 0xffff0300 0x00000000", + "vme_write 0x09 d16 0xffff0302 0x00000000", + "vme_write 0x09 d16 0xffff0304 0x00000000", + "vme_write 0x09 d16 0xffff0306 0x00000000", + "vme_write 0x09 d16 0xffff030a 0x00000000", + "vme_write 0x09 d16 0xffff0310 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x00000011", + "vme_write 0x09 d16 0xffff0300 0x00000000", + "vme_write 0x09 d16 0xffff0302 0x00000000", + "vme_write 0x09 d16 0xffff0304 0x00000000", + "vme_write 0x09 d16 0xffff0306 0x00000000", + "vme_write 0x09 d16 0xffff030a 0x00000000", + "vme_write 0x09 d16 0xffff0310 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x00000012", + "vme_write 0x09 d16 0xffff0300 0x00000000", + "vme_write 0x09 d16 0xffff0302 0x00000000", + "vme_write 0x09 d16 0xffff0304 0x00000000", + "vme_write 0x09 d16 0xffff0306 0x00000000", + "vme_write 0x09 d16 0xffff030a 0x00000000", + "vme_write 0x09 d16 0xffff0310 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x00000013", + "vme_write 0x09 d16 0xffff0300 0x00000000", + "vme_write 0x09 d16 0xffff0302 0x00000000", + "vme_write 0x09 d16 0xffff0304 0x00000000", + "vme_write 0x09 d16 0xffff0306 0x00000000", + "vme_write 0x09 d16 0xffff030a 0x00000000", + "vme_write 0x09 d16 0xffff0310 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x00000014", + "vme_write 0x09 d16 0xffff0300 0x00000000", + "vme_write 0x09 d16 0xffff0302 0x00000000", + "vme_write 0x09 d16 0xffff0304 0x00000000", + "vme_write 0x09 d16 0xffff0306 0x00000000", + "vme_write 0x09 d16 0xffff030a 0x00000000", + "vme_write 0x09 d16 0xffff0310 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x00000015", + "vme_write 0x09 d16 0xffff0300 0x00000000", + "vme_write 0x09 d16 0xffff0302 0x00000000", + "vme_write 0x09 d16 0xffff0304 0x00000000", + "vme_write 0x09 d16 0xffff0306 0x00000000", + "vme_write 0x09 d16 0xffff030a 0x00000000", + "vme_write 0x09 d16 0xffff0310 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x00000016", + "vme_write 0x09 d16 0xffff0300 0x00000000", + "vme_write 0x09 d16 0xffff0302 0x00000000", + "vme_write 0x09 d16 0xffff0304 0x00000000", + "vme_write 0x09 d16 0xffff0306 0x00000000", + "vme_write 0x09 d16 0xffff030a 0x00000000", + "vme_write 0x09 d16 0xffff0310 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x00000017", + "vme_write 0x09 d16 0xffff0300 0x00000000", + "vme_write 0x09 d16 0xffff0302 0x00000000", + "vme_write 0x09 d16 0xffff0304 0x00000000", + "vme_write 0x09 d16 0xffff0306 0x00000000", + "vme_write 0x09 d16 0xffff030a 0x00000000", + "vme_write 0x09 d16 0xffff0310 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x00000018", + "vme_write 0x09 d16 0xffff0300 0x00000000", + "vme_write 0x09 d16 0xffff0302 0x00000000", + "vme_write 0x09 d16 0xffff0304 0x00000000", + "vme_write 0x09 d16 0xffff0306 0x00000000", + "vme_write 0x09 d16 0xffff030a 0x00000000", + "vme_write 0x09 d16 0xffff0310 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x00000019", + "vme_write 0x09 d16 0xffff0300 0x00000000", + "vme_write 0x09 d16 0xffff0302 0x00000000", + "vme_write 0x09 d16 0xffff0304 0x00000000", + "vme_write 0x09 d16 0xffff0306 0x00000000", + "vme_write 0x09 d16 0xffff030a 0x00000000", + "vme_write 0x09 d16 0xffff0310 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x0000001a", + "vme_write 0x09 d16 0xffff0300 0x00000000", + "vme_write 0x09 d16 0xffff0302 0x00000000", + "vme_write 0x09 d16 0xffff0304 0x00000000", + "vme_write 0x09 d16 0xffff0306 0x00000000", + "vme_write 0x09 d16 0xffff030a 0x00000000", + "vme_write 0x09 d16 0xffff0310 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x0000001b", + "vme_write 0x09 d16 0xffff0300 0x00000000", + "vme_write 0x09 d16 0xffff0302 0x00000000", + "vme_write 0x09 d16 0xffff0304 0x00000000", + "vme_write 0x09 d16 0xffff0306 0x00000000", + "vme_write 0x09 d16 0xffff030a 0x00000000", + "vme_write 0x09 d16 0xffff0310 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x0000001c", + "vme_write 0x09 d16 0xffff0300 0x00000000", + "vme_write 0x09 d16 0xffff0302 0x00000000", + "vme_write 0x09 d16 0xffff0304 0x00000000", + "vme_write 0x09 d16 0xffff0306 0x00000000", + "vme_write 0x09 d16 0xffff030a 0x00000000", + "vme_write 0x09 d16 0xffff0310 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x0000001d", + "vme_write 0x09 d16 0xffff0300 0x00000000", + "vme_write 0x09 d16 0xffff0302 0x00000000", + "vme_write 0x09 d16 0xffff0304 0x00000000", + "vme_write 0x09 d16 0xffff0306 0x00000000", + "vme_write 0x09 d16 0xffff030a 0x00000000", + "vme_write 0x09 d16 0xffff0310 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x00000021", + "vme_write 0x09 d16 0xffff0300 0x00000000", + "vme_write 0x09 d16 0xffff0302 0x00000000", + "vme_write 0x09 d16 0xffff0304 0x00000000", + "vme_write 0x09 d16 0xffff0306 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x00000022", + "vme_write 0x09 d16 0xffff0300 0x00000000", + "vme_write 0x09 d16 0xffff0302 0x00000000", + "vme_write 0x09 d16 0xffff0304 0x00000000", + "vme_write 0x09 d16 0xffff0306 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x00000023", + "vme_write 0x09 d16 0xffff0300 0x00000000", + "vme_write 0x09 d16 0xffff0302 0x00000000", + "vme_write 0x09 d16 0xffff0304 0x00000000", + "vme_write 0x09 d16 0xffff0306 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x00000024", + "vme_write 0x09 d16 0xffff0300 0x00000000", + "vme_write 0x09 d16 0xffff0302 0x00000000", + "vme_write 0x09 d16 0xffff0304 0x00000000", + "vme_write 0x09 d16 0xffff0306 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x00000025", + "vme_write 0x09 d16 0xffff0300 0x00000000", + "vme_write 0x09 d16 0xffff0302 0x00000000", + "vme_write 0x09 d16 0xffff0304 0x00000000", + "vme_write 0x09 d16 0xffff0306 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x00000026", + "vme_write 0x09 d16 0xffff0300 0x00000000", + "vme_write 0x09 d16 0xffff0302 0x00000000", + "vme_write 0x09 d16 0xffff0304 0x00000000", + "vme_write 0x09 d16 0xffff0306 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x00000100", + "vme_write 0x09 d16 0xffff0300 0x00000000", + "vme_write 0x09 d16 0xffff0302 0x00000000", + "vme_write 0x09 d16 0xffff0304 0x00000000", + "vme_write 0x09 d16 0xffff0306 0x00000000", + "vme_write 0x09 d16 0xffff0308 0x00000000", + "vme_write 0x09 d16 0xffff030a 0x00000000", + "vme_write 0x09 d16 0xffff030c 0x00000000", + "vme_write 0x09 d16 0xffff030e 0x00000000", + "vme_write 0x09 d16 0xffff0310 0x00000000", + "vme_write 0x09 d16 0xffff0312 0x00000000", + "vme_write 0x09 d16 0xffff0314 0x00000000", + "vme_write 0x09 d16 0xffff0316 0x00000000", + "vme_write 0x09 d16 0xffff0318 0x00000000", + "vme_write 0x09 d16 0xffff031a 0x00000000", + "vme_write 0x09 d16 0xffff031c 0x00000000", + "vme_write 0x09 d16 0xffff031e 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x00000101", + "vme_write 0x09 d16 0xffff0300 0x00000000", + "vme_write 0x09 d16 0xffff0302 0x00000000", + "vme_write 0x09 d16 0xffff0304 0x00000000", + "vme_write 0x09 d16 0xffff0306 0x00000000", + "vme_write 0x09 d16 0xffff0308 0x00000000", + "vme_write 0x09 d16 0xffff030a 0x00000000", + "vme_write 0x09 d16 0xffff030c 0x00000000", + "vme_write 0x09 d16 0xffff030e 0x00000000", + "vme_write 0x09 d16 0xffff0310 0x00000000", + "vme_write 0x09 d16 0xffff0312 0x00000000", + "vme_write 0x09 d16 0xffff0314 0x00000000", + "vme_write 0x09 d16 0xffff0316 0x00000000", + "vme_write 0x09 d16 0xffff0318 0x00000000", + "vme_write 0x09 d16 0xffff031a 0x00000000", + "vme_write 0x09 d16 0xffff031c 0x00000000", + "vme_write 0x09 d16 0xffff031e 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x00000102", + "vme_write 0x09 d16 0xffff0300 0x00000000", + "vme_write 0x09 d16 0xffff0302 0x00000000", + "vme_write 0x09 d16 0xffff0304 0x00000000", + "vme_write 0x09 d16 0xffff0306 0x00000000", + "vme_write 0x09 d16 0xffff0308 0x00000000", + "vme_write 0x09 d16 0xffff030a 0x00000000", + "vme_write 0x09 d16 0xffff030c 0x00000000", + "vme_write 0x09 d16 0xffff030e 0x00000000", + "vme_write 0x09 d16 0xffff0310 0x00000000", + "vme_write 0x09 d16 0xffff0312 0x00000000", + "vme_write 0x09 d16 0xffff0314 0x00000000", + "vme_write 0x09 d16 0xffff0316 0x00000000", + "vme_write 0x09 d16 0xffff0318 0x00000000", + "vme_write 0x09 d16 0xffff031a 0x00000000", + "vme_write 0x09 d16 0xffff031c 0x00000000", + "vme_write 0x09 d16 0xffff031e 0x00000000", + "vme_write 0x09 d16 0xffff0380 0x00000000", + "vme_write 0x09 d16 0xffff0382 0x00000000", + "vme_write 0x09 d16 0xffff0384 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x00000103", + "vme_write 0x09 d16 0xffff0300 0x00000000", + "vme_write 0x09 d16 0xffff0302 0x00000000", + "vme_write 0x09 d16 0xffff0304 0x00000000", + "vme_write 0x09 d16 0xffff0306 0x00000000", + "vme_write 0x09 d16 0xffff0308 0x00000000", + "vme_write 0x09 d16 0xffff030a 0x00000000", + "vme_write 0x09 d16 0xffff030c 0x00000000", + "vme_write 0x09 d16 0xffff030e 0x00000000", + "vme_write 0x09 d16 0xffff0310 0x00000000", + "vme_write 0x09 d16 0xffff0312 0x00000000", + "vme_write 0x09 d16 0xffff0314 0x00000000", + "vme_write 0x09 d16 0xffff0316 0x00000000", + "vme_write 0x09 d16 0xffff0318 0x00000000", + "vme_write 0x09 d16 0xffff031a 0x00000000", + "vme_write 0x09 d16 0xffff031c 0x00000000", + "vme_write 0x09 d16 0xffff031e 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x00000104", + "vme_write 0x09 d16 0xffff0300 0x00000000", + "vme_write 0x09 d16 0xffff0302 0x00000000", + "vme_write 0x09 d16 0xffff0304 0x00000000", + "vme_write 0x09 d16 0xffff0306 0x00000000", + "vme_write 0x09 d16 0xffff0308 0x00000000", + "vme_write 0x09 d16 0xffff030a 0x00000000", + "vme_write 0x09 d16 0xffff030c 0x00000000", + "vme_write 0x09 d16 0xffff030e 0x00000000", + "vme_write 0x09 d16 0xffff0310 0x00000000", + "vme_write 0x09 d16 0xffff0312 0x00000000", + "vme_write 0x09 d16 0xffff0314 0x00000000", + "vme_write 0x09 d16 0xffff0316 0x00000000", + "vme_write 0x09 d16 0xffff0318 0x00000000", + "vme_write 0x09 d16 0xffff031a 0x00000000", + "vme_write 0x09 d16 0xffff031c 0x00000000", + "vme_write 0x09 d16 0xffff031e 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x00000105", + "vme_write 0x09 d16 0xffff0300 0x00000000", + "vme_write 0x09 d16 0xffff0302 0x00000000", + "vme_write 0x09 d16 0xffff0304 0x00000000", + "vme_write 0x09 d16 0xffff0306 0x00000000", + "vme_write 0x09 d16 0xffff0308 0x00000000", + "vme_write 0x09 d16 0xffff030a 0x00000000", + "vme_write 0x09 d16 0xffff030c 0x00000000", + "vme_write 0x09 d16 0xffff030e 0x00000000", + "vme_write 0x09 d16 0xffff0310 0x00000000", + "vme_write 0x09 d16 0xffff0312 0x00000000", + "vme_write 0x09 d16 0xffff0314 0x00000000", + "vme_write 0x09 d16 0xffff0316 0x00000000", + "vme_write 0x09 d16 0xffff0318 0x00000000", + "vme_write 0x09 d16 0xffff031a 0x00000000", + "vme_write 0x09 d16 0xffff031c 0x00000000", + "vme_write 0x09 d16 0xffff031e 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x00000106", + "vme_write 0x09 d16 0xffff0300 0x00000000", + "vme_write 0x09 d16 0xffff0302 0x00000000", + "vme_write 0x09 d16 0xffff0304 0x00000000", + "vme_write 0x09 d16 0xffff0306 0x00000000", + "vme_write 0x09 d16 0xffff0308 0x00000000", + "vme_write 0x09 d16 0xffff030a 0x00000000", + "vme_write 0x09 d16 0xffff030c 0x00000000", + "vme_write 0x09 d16 0xffff030e 0x00000000", + "vme_write 0x09 d16 0xffff0310 0x00000000", + "vme_write 0x09 d16 0xffff0312 0x00000000", + "vme_write 0x09 d16 0xffff0314 0x00000000", + "vme_write 0x09 d16 0xffff0316 0x00000000", + "vme_write 0x09 d16 0xffff0318 0x00000000", + "vme_write 0x09 d16 0xffff031a 0x00000000", + "vme_write 0x09 d16 0xffff031c 0x00000000", + "vme_write 0x09 d16 0xffff031e 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x00000200", + "vme_write 0x09 d16 0xffff0300 0x00000000", + "vme_write 0x09 d16 0xffff0302 0x00000000", + "vme_write 0x09 d16 0xffff0304 0x00000000", + "vme_write 0x09 d16 0xffff0306 0x00000000", + "vme_write 0x09 d16 0xffff0308 0x00000000", + "vme_write 0x09 d16 0xffff030a 0x00000000", + "vme_write 0x09 d16 0xffff030c 0x00000000", + "vme_write 0x09 d16 0xffff030e 0x00000000", + "vme_write 0x09 d16 0xffff0310 0x00000000", + "vme_write 0x09 d16 0xffff0312 0x00000000", + "vme_write 0x09 d16 0xffff0314 0x00000000", + "vme_write 0x09 d16 0xffff0316 0x00000000", + "vme_write 0x09 d16 0xffff0318 0x00000000", + "vme_write 0x09 d16 0xffff031a 0x00000000", + "vme_write 0x09 d16 0xffff031c 0x00000000", + "vme_write 0x09 d16 0xffff031e 0x00000000", + "vme_write 0x09 d16 0xffff0320 0x00000000", + "vme_write 0x09 d16 0xffff0380 0x00000000", + "vme_write 0x09 d16 0xffff0382 0x00000000", + "vme_write 0x09 d16 0xffff0384 0x00000000", + "vme_write 0x09 d16 0xffff0332 0x00000000", + "vme_write 0x09 d16 0xffff0334 0x00000008", + "vme_write 0x09 d16 0xffff0336 0x00000000", + "vme_write 0x09 d16 0xffff0338 0x00000000", + "vme_write 0x09 d16 0xffff0386 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x00000201", + "vme_write 0x09 d16 0xffff0300 0x00000000", + "vme_write 0x09 d16 0xffff0302 0x00000000", + "vme_write 0x09 d16 0xffff0304 0x00000000", + "vme_write 0x09 d16 0xffff0306 0x00000000", + "vme_write 0x09 d16 0xffff0308 0x00000000", + "vme_write 0x09 d16 0xffff030a 0x00000000", + "vme_write 0x09 d16 0xffff030c 0x00000000", + "vme_write 0x09 d16 0xffff030e 0x00000000", + "vme_write 0x09 d16 0xffff0310 0x00000000", + "vme_write 0x09 d16 0xffff0312 0x00000000", + "vme_write 0x09 d16 0xffff0314 0x00000000", + "vme_write 0x09 d16 0xffff0316 0x00000000", + "vme_write 0x09 d16 0xffff0318 0x00000000", + "vme_write 0x09 d16 0xffff031a 0x00000000", + "vme_write 0x09 d16 0xffff031c 0x00000000", + "vme_write 0x09 d16 0xffff031e 0x00000000", + "vme_write 0x09 d16 0xffff0320 0x00000000", + "vme_write 0x09 d16 0xffff0380 0x00000000", + "vme_write 0x09 d16 0xffff0382 0x00000000", + "vme_write 0x09 d16 0xffff0384 0x00000000", + "vme_write 0x09 d16 0xffff0332 0x00000000", + "vme_write 0x09 d16 0xffff0334 0x00000008", + "vme_write 0x09 d16 0xffff0336 0x00000000", + "vme_write 0x09 d16 0xffff0338 0x00000000", + "vme_write 0x09 d16 0xffff0386 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x00000202", + "vme_write 0x09 d16 0xffff0300 0x00000000", + "vme_write 0x09 d16 0xffff0302 0x00000000", + "vme_write 0x09 d16 0xffff0304 0x00000000", + "vme_write 0x09 d16 0xffff0306 0x00000000", + "vme_write 0x09 d16 0xffff0308 0x00000000", + "vme_write 0x09 d16 0xffff030a 0x00000000", + "vme_write 0x09 d16 0xffff030c 0x00000000", + "vme_write 0x09 d16 0xffff030e 0x00000000", + "vme_write 0x09 d16 0xffff0310 0x00000000", + "vme_write 0x09 d16 0xffff0312 0x00000000", + "vme_write 0x09 d16 0xffff0314 0x00000000", + "vme_write 0x09 d16 0xffff0316 0x00000000", + "vme_write 0x09 d16 0xffff0318 0x00000000", + "vme_write 0x09 d16 0xffff031a 0x00000000", + "vme_write 0x09 d16 0xffff031c 0x00000000", + "vme_write 0x09 d16 0xffff031e 0x00000000", + "vme_write 0x09 d16 0xffff0320 0x00000000", + "vme_write 0x09 d16 0xffff0380 0x00000000", + "vme_write 0x09 d16 0xffff0382 0x00000000", + "vme_write 0x09 d16 0xffff0384 0x00000000", + "vme_write 0x09 d16 0xffff0332 0x00000000", + "vme_write 0x09 d16 0xffff0334 0x00000008", + "vme_write 0x09 d16 0xffff0336 0x00000000", + "vme_write 0x09 d16 0xffff0338 0x00000000", + "vme_write 0x09 d16 0xffff0386 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x00000300", + "vme_write 0x09 d16 0xffff0300 0x00000000", + "vme_write 0x09 d16 0xffff0302 0x00000000", + "vme_write 0x09 d16 0xffff0304 0x00000000", + "vme_write 0x09 d16 0xffff0380 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x00000301", + "vme_write 0x09 d16 0xffff0300 0x00000000", + "vme_write 0x09 d16 0xffff0302 0x00000000", + "vme_write 0x09 d16 0xffff0304 0x00000000", + "vme_write 0x09 d16 0xffff0380 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x00000302", + "vme_write 0x09 d16 0xffff0300 0x00000000", + "vme_write 0x09 d16 0xffff0302 0x00000000", + "vme_write 0x09 d16 0xffff0304 0x00000000", + "vme_write 0x09 d16 0xffff0380 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x00000303", + "vme_write 0x09 d16 0xffff0300 0x00000000", + "vme_write 0x09 d16 0xffff0302 0x00000000", + "vme_write 0x09 d16 0xffff0304 0x00000000", + "vme_write 0x09 d16 0xffff0380 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x00000304", + "vme_write 0x09 d16 0xffff0300 0x00000000", + "vme_write 0x09 d16 0xffff0380 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x00000305", + "vme_write 0x09 d16 0xffff0300 0x00000000", + "vme_write 0x09 d16 0xffff0380 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x00000306", + "vme_write 0x09 d16 0xffff0300 0x00000000", + "vme_write 0x09 d16 0xffff0380 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x00000307", + "vme_write 0x09 d16 0xffff0300 0x00000000", + "vme_write 0x09 d16 0xffff0380 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x00000308", + "vme_write 0x09 d16 0xffff030e 0x00000000", + "vme_write 0x09 d16 0xffff0380 0x00000000", + "vme_write 0x09 d16 0xffff0382 0x00000015", + "vme_write 0x09 d16 0xffff0200 0x00000309", + "vme_write 0x09 d16 0xffff030e 0x00000000", + "vme_write 0x09 d16 0xffff0380 0x00000000", + "vme_write 0x09 d16 0xffff0382 0x00000015", + "vme_write 0x09 d16 0xffff0200 0x0000030a", + "vme_write 0x09 d16 0xffff030e 0x00000000", + "vme_write 0x09 d16 0xffff0380 0x00000000", + "vme_write 0x09 d16 0xffff0382 0x00000015", + "vme_write 0x09 d16 0xffff0200 0x0000030b", + "vme_write 0x09 d16 0xffff030e 0x00000000", + "vme_write 0x09 d16 0xffff0380 0x00000000", + "vme_write 0x09 d16 0xffff0382 0x00000015", + "vme_write 0x09 d16 0xffff0200 0x0000030c", + "vme_write 0x09 d16 0xffff030e 0x00000000", + "vme_write 0x09 d16 0xffff0380 0x00000000", + "vme_write 0x09 d16 0xffff0382 0x00000015", + "vme_write 0x09 d16 0xffff0200 0x0000030d", + "vme_write 0x09 d16 0xffff030e 0x00000000", + "vme_write 0x09 d16 0xffff0380 0x00000000", + "vme_write 0x09 d16 0xffff0382 0x00000015", + "vme_write 0x09 d16 0xffff0200 0x0000030e", + "vme_write 0x09 d16 0xffff030e 0x00000000", + "vme_write 0x09 d16 0xffff0380 0x00000000", + "vme_write 0x09 d16 0xffff0382 0x00000015", + "vme_write 0x09 d16 0xffff0200 0x0000030f", + "vme_write 0x09 d16 0xffff030e 0x00000000", + "vme_write 0x09 d16 0xffff0380 0x00000000", + "vme_write 0x09 d16 0xffff0382 0x00000015", + "vme_write 0x09 d16 0xffff0200 0x00000310", + "vme_write 0x09 d16 0xffff0380 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x00000311", + "vme_write 0x09 d16 0xffff0380 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x00000312", + "vme_write 0x09 d16 0xffff0380 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x00000313", + "vme_write 0x09 d16 0xffff0380 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x00000314", + "vme_write 0x09 d16 0xffff0380 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x00000315", + "vme_write 0x09 d16 0xffff0380 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x00000316", + "vme_write 0x09 d16 0xffff0380 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x00000317", + "vme_write 0x09 d16 0xffff0380 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x00000318", + "vme_write 0x09 d16 0xffff0380 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x00000319", + "vme_write 0x09 d16 0xffff0380 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x0000031a", + "vme_write 0x09 d16 0xffff0380 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x0000031b", + "vme_write 0x09 d16 0xffff0380 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x0000031c", + "vme_write 0x09 d16 0xffff0380 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x0000031d", + "vme_write 0x09 d16 0xffff0380 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x0000031e", + "vme_write 0x09 d16 0xffff0300 0x00000000", + "vme_write 0x09 d16 0xffff0302 0x00000000", + "vme_write 0x09 d16 0xffff0304 0x00000000", + "vme_write 0x09 d16 0xffff0306 0x00000000", + "vme_write 0x09 d16 0xffff0310 0x00000000", + "vme_write 0x09 d16 0xffff0380 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x0000031f", + "vme_write 0x09 d16 0xffff0300 0x00000000", + "vme_write 0x09 d16 0xffff0302 0x00000000", + "vme_write 0x09 d16 0xffff0304 0x00000000", + "vme_write 0x09 d16 0xffff0306 0x00000000", + "vme_write 0x09 d16 0xffff0310 0x00000000", + "vme_write 0x09 d16 0xffff0380 0x00000000", + "vme_write 0x09 d16 0xffff0200 0x00000320", + "vme_write 0x09 d16 0xffff0300 0x00000000", + "vme_write 0x09 d16 0xffff0302 0x00000000", + "vme_write 0x09 d16 0xffff0304 0x00000000", + "vme_write 0x09 d16 0xffff0306 0x00000000", + "vme_write 0x09 d16 0xffff0310 0x00000000", + "vme_write 0x09 d16 0xffff0380 0x00000000" + ], + "name": "" + } + ], + "name": "init_trigger_io" + }, + "mcst_daq_start": { + "groups": null, + "name": "mcst_daq_start" + }, + "mcst_daq_stop": { + "groups": null, + "name": "mcst_daq_stop" + }, + "mvlc_connection": { + "ethHost": "", + "ethJumboEnable": "false", + "type": "MVLC_USB", + "usbIndex": "-1", + "usbSerial": "" + }, + "readout_stacks": null, + "stack_triggers": null, + "stop_commands": { + "groups": null, + "name": "stop_commands" + } + } + }, + "modules": [ + { + "init": { + "groups": [ + { + "contents": [ + "vme_write 0x09 d16 0x00006008 0x00000001", + "software_delay 500", + "vme_read 0x09 d16 0x00006008", + "vme_read 0x09 d16 0x0000600e", + "vme_write 0x09 d16 0x0000603a 0x00000000", + "vme_write 0x09 d16 0x0000603c 0x00000001", + "vme_write 0x09 d16 0x00006034 0x00000001" + ], + "name": "reset" + }, + { + "contents": [ + "vme_write 0x09 d16 0x00006040 0x00000000", + "vme_write 0x09 d16 0x00006042 0x00000003", + "vme_write 0x09 d16 0x00006050 0x00000014", + "vme_write 0x09 d16 0x00006052 0x00000014", + "vme_write 0x09 d16 0x00006054 0x00000032", + "vme_write 0x09 d16 0x00006056 0x00000032", + "vme_write 0x09 d16 0x00006058 0x00000000", + "vme_write 0x09 d16 0x00006060 0x00000000", + "vme_write 0x09 d16 0x00006062 0x00000000", + "vme_write 0x09 d16 0x00006064 0x00000000", + "vme_write 0x09 d16 0x00006066 0x00000000", + "vme_write 0x09 d16 0x00006068 0x00000000", + "vme_write 0x09 d16 0x0000606a 0x00000000", + "vme_write 0x09 d16 0x0000606c 0x00000000", + "vme_write 0x09 d16 0x0000606e 0x00000000", + "vme_write 0x09 d16 0x00006070 0x00000000", + "vme_write 0x09 d16 0x00006096 0x00000000", + "vme_write 0x09 d16 0x00006098 0x00000001", + "vme_write 0x09 d16 0x0000604c 0x00000000", + "vme_write 0x09 d16 0x00004000 0x00000000", + "vme_write 0x09 d16 0x00004002 0x00000000", + "vme_write 0x09 d16 0x00004004 0x00000000", + "vme_write 0x09 d16 0x00004006 0x00000000", + "vme_write 0x09 d16 0x00004008 0x00000000", + "vme_write 0x09 d16 0x0000400a 0x00000000", + "vme_write 0x09 d16 0x0000400c 0x00000000", + "vme_write 0x09 d16 0x0000400e 0x00000000", + "vme_write 0x09 d16 0x00004010 0x00000000", + "vme_write 0x09 d16 0x00004012 0x00000000", + "vme_write 0x09 d16 0x00004014 0x00000000", + "vme_write 0x09 d16 0x00004016 0x00000000", + "vme_write 0x09 d16 0x00004018 0x00000000", + "vme_write 0x09 d16 0x0000401a 0x00000000", + "vme_write 0x09 d16 0x0000401c 0x00000000", + "vme_write 0x09 d16 0x0000401e 0x00000000", + "vme_write 0x09 d16 0x00004020 0x00000000", + "vme_write 0x09 d16 0x00004022 0x00000000", + "vme_write 0x09 d16 0x00004024 0x00000000", + "vme_write 0x09 d16 0x00004026 0x00000000", + "vme_write 0x09 d16 0x00004028 0x00000000", + "vme_write 0x09 d16 0x0000402a 0x00000000", + "vme_write 0x09 d16 0x0000402c 0x00000000", + "vme_write 0x09 d16 0x0000402e 0x00000000", + "vme_write 0x09 d16 0x00004030 0x00000000", + "vme_write 0x09 d16 0x00004032 0x00000000", + "vme_write 0x09 d16 0x00004034 0x00000000", + "vme_write 0x09 d16 0x00004036 0x00000000", + "vme_write 0x09 d16 0x00004038 0x00000000", + "vme_write 0x09 d16 0x0000403a 0x00000000", + "vme_write 0x09 d16 0x0000403c 0x00000000", + "vme_write 0x09 d16 0x0000403e 0x00000000" + ], + "name": "module_init" + }, + { + "contents": [ + "vme_write 0x09 d16 0x00006010 0x00000000", + "vme_write 0x09 d16 0x0000601c 0x00000000", + "vme_write 0x09 d16 0x0000601e 0x00000003", + "vme_write 0x09 d16 0x00006038 0x00000001", + "vme_write 0x09 d16 0x00006036 0x0000000b", + "vme_write 0x09 d16 0x00006032 0x00000003", + "vme_write 0x09 d16 0x0000601a 0x00000001", + "vme_write 0x09 d16 0x0000603a 0x00000000", + "vme_write 0x09 d16 0x0000603c 0x00000001", + "vme_write 0x09 d16 0x00006034 0x00000001", + "vme_write 0x09 d16 0x00006020 0x00000080", + "vme_write 0x09 d16 0x00006024 0x00000000" + ], + "name": "vme_interface_settings" + } + ], + "name": "madc32.init" + }, + "name": "madc32", + "readout": { + "groups": [ + { + "contents": [ + "vme_block_read 0x0b 65535 0x00000000" + ], + "name": "readout" + } + ], + "name": "madc32.readout" + } + }, + { + "init": { + "groups": [ + { + "contents": [ + "vme_write 0x09 d16 0x00006008 0x00000001", + "software_delay 500", + "vme_read 0x09 d16 0x00006008", + "vme_read 0x09 d16 0x0000600e" + ], + "name": "reset" + }, + { + "contents": [ + "vme_write 0x09 d16 0x00000010 0x00000001", + "vme_write 0x09 d16 0x00000018 0x00000001", + "vme_write 0x09 d16 0x0000001c 0x00000001", + "vme_write 0x09 d16 0x00000012 0x00000000", + "vme_write 0x09 d16 0x00000014 0x00000000", + "vme_write 0x09 d16 0x00000016 0x00000000", + "vme_write 0x09 d16 0x00000040 0x00000000", + "vme_write 0x09 d16 0x00000042 0x00000000", + "vme_write 0x09 d16 0x00000044 0x00000000", + "vme_write 0x09 d16 0x00000046 0x00000000", + "vme_write 0x09 d16 0x0000004c 0x00000000", + "vme_write 0x09 d16 0x0000004e 0x00000000", + "vme_write 0x09 d16 0x00000060 0x00000000", + "vme_write 0x09 d16 0x00000062 0x00000000", + "vme_write 0x09 d16 0x00000064 0x00000000", + "vme_write 0x09 d16 0x00000066 0x00000000", + "vme_write 0x09 d16 0x0000006c 0x00000000", + "vme_write 0x09 d16 0x0000006e 0x00000000", + "vme_write 0x09 d16 0x00000080 0x00000000", + "vme_write 0x09 d16 0x00000082 0x00000000", + "vme_write 0x09 d16 0x00000084 0x00000000", + "vme_write 0x09 d16 0x00000086 0x00000000", + "vme_write 0x09 d16 0x00000090 0x00000000", + "vme_write 0x09 d16 0x00000092 0x00000000", + "vme_write 0x09 d16 0x00000094 0x00000000", + "vme_write 0x09 d16 0x00000096 0x00000000", + "vme_write 0x09 d16 0x000000a4 0x00000000", + "vme_write 0x09 d16 0x000000a6 0x00000000" + ], + "name": "module_init" + }, + { + "contents": [ + "vme_write 0x09 d16 0x00000182 0x00000000", + "vme_write 0x09 d16 0x00000184 0x00000002", + "vme_write 0x09 d16 0x00000100 0x00000000", + "vme_write 0x09 d16 0x00000102 0x00000002", + "vme_write 0x09 d16 0x00000180 0x00000000", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000180 0x00000001", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000180 0x00000002", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000180 0x00000003", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000180 0x00000004", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000180 0x00000005", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000180 0x00000006", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000180 0x00000007", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1" + ], + "name": "mpsd_thresholds" + }, + { + "contents": [ + "vme_write 0x09 d16 0x00000182 0x00000000", + "vme_write 0x09 d16 0x00000184 0x00000000", + "vme_write 0x09 d16 0x00000102 0x00000003", + "vme_write 0x09 d16 0x00000180 0x00000000", + "vme_write 0x09 d16 0x00000100 0x00000000", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000100 0x00000001", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000100 0x00000002", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000100 0x00000003", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000100 0x00000004", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000100 0x00000005", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000100 0x00000006", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000100 0x00000007", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000180 0x00000001", + "vme_write 0x09 d16 0x00000100 0x00000000", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000100 0x00000001", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000100 0x00000002", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000100 0x00000003", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000100 0x00000004", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000100 0x00000005", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000100 0x00000006", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000100 0x00000007", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000180 0x00000002", + "vme_write 0x09 d16 0x00000100 0x00000000", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000100 0x00000001", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000100 0x00000002", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000100 0x00000003", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000100 0x00000004", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000100 0x00000005", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000100 0x00000006", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000100 0x00000007", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000180 0x00000003", + "vme_write 0x09 d16 0x00000100 0x00000000", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000100 0x00000001", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000100 0x00000002", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000100 0x00000003", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000100 0x00000004", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000100 0x00000005", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000100 0x00000006", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000100 0x00000007", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000180 0x00000004", + "vme_write 0x09 d16 0x00000100 0x00000000", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000100 0x00000001", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000100 0x00000002", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000100 0x00000003", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000100 0x00000004", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000100 0x00000005", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000100 0x00000006", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000100 0x00000007", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000180 0x00000005", + "vme_write 0x09 d16 0x00000100 0x00000000", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000100 0x00000001", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000100 0x00000002", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000100 0x00000003", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000100 0x00000004", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000100 0x00000005", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000100 0x00000006", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000100 0x00000007", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000180 0x00000006", + "vme_write 0x09 d16 0x00000100 0x00000000", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000100 0x00000001", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000100 0x00000002", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000100 0x00000003", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000100 0x00000004", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000100 0x00000005", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000100 0x00000006", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000100 0x00000007", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000180 0x00000007", + "vme_write 0x09 d16 0x00000100 0x00000000", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000100 0x00000001", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000100 0x00000002", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000100 0x00000003", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000100 0x00000004", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000100 0x00000005", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000100 0x00000006", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1", + "vme_write 0x09 d16 0x00000100 0x00000007", + "vme_write 0x09 d16 0x00000104 0x00000080", + "vme_write 0x09 d16 0x00000188 0x00000000", + "software_delay 1" + ], + "name": "mpsd_channel_gains" + }, + { + "contents": [ + "vme_write 0x09 d16 0x00000110 0x00000032", + "vme_write 0x09 d16 0x00000112 0x00000080", + "vme_write 0x09 d16 0x00000114 0x00000000", + "vme_write 0x09 d16 0x00000116 0x00000001" + ], + "name": "mpsd_test_pulsers" + } + ], + "name": "mcpd8_mpsd.init" + }, + "name": "mcpd8_mpsd", + "readout": { + "groups": [ + { + "contents": [ + "vme_block_read 0x08 65535 0x00000000" + ], + "name": "readout" + } + ], + "name": "mcpd8_mpsd.readout" + } + }, + { + "init": { + "groups": [ + { + "contents": [ + "vme_write 0x09 d16 0x00006008 0x00000001", + "software_delay 500", + "vme_read 0x09 d16 0x00006008", + "vme_read 0x09 d16 0x0000600e", + "vme_write 0x09 d16 0x0000603a 0x00000000", + "vme_write 0x09 d16 0x0000603c 0x00000001", + "vme_write 0x09 d16 0x00006034 0x00000001" + ], + "name": "reset" + }, + { + "contents": [ + "vme_write 0x09 d16 0x00006040 0x00000003", + "vme_write 0x09 d16 0x00006042 0x00000007", + "vme_write 0x09 d16 0x00006044 0x00000007", + "vme_write 0x09 d16 0x00006046 0x00000003", + "vme_write 0x09 d16 0x0000604c 0x00000000", + "vme_write 0x09 d16 0x00006050 0x000003e8", + "vme_write 0x09 d16 0x00006052 0x00000014", + "vme_write 0x09 d16 0x00006054 0x0000002c", + "vme_write 0x09 d16 0x00006056 0x0000002c", + "vme_write 0x09 d16 0x00006060 0x00000001", + "vme_write 0x09 d16 0x00006064 0x00000003", + "vme_write 0x09 d16 0x00006064 0x00000003", + "vme_write 0x09 d16 0x0000606a 0x00000003", + "vme_write 0x09 d16 0x0000606c 0x00000003", + "vme_write 0x09 d16 0x0000606e 0x00000001", + "vme_write 0x09 d16 0x00006074 0x00000011", + "vme_write 0x09 d16 0x00006076 0x00000011", + "vme_write 0x09 d16 0x00006078 0x00000000" + ], + "name": "module_init" + }, + { + "contents": [ + "vme_write 0x09 d16 0x00006010 0x00000000", + "vme_write 0x09 d16 0x0000601c 0x00000000", + "vme_write 0x09 d16 0x0000601e 0x00000003", + "vme_write 0x09 d16 0x00006038 0x00000001", + "vme_write 0x09 d16 0x00006036 0x0000000b", + "vme_write 0x09 d16 0x0000601a 0x00000001", + "vme_write 0x09 d16 0x0000603a 0x00000000", + "vme_write 0x09 d16 0x0000603c 0x00000001", + "vme_write 0x09 d16 0x00006034 0x00000001", + "vme_write 0x09 d16 0x00006020 0x00000080", + "vme_write 0x09 d16 0x00006024 0x00000000" + ], + "name": "vme_interface_settings" + }, + { + "contents": [ + "vme_write 0x09 d16 0x00006040 0x00000000", + "software_delay 10", + "vme_write 0x09 d16 0x00006080 0x00000001", + "vme_write 0x09 d16 0x00006080 0x00000005", + "vme_write 0x09 d16 0x00006084 0x00000010", + "vme_write 0x09 d16 0x00006086 0x00000000", + "vme_write 0x09 d16 0x00006088 0x0000001a", + "software_delay 5", + "vme_write 0x09 d16 0x00006080 0x00000001", + "vme_write 0x09 d16 0x00006082 0x00000005", + "vme_write 0x09 d16 0x00006084 0x00000010", + "vme_write 0x09 d16 0x00006086 0x00000001", + "vme_write 0x09 d16 0x00006088 0x000000ff", + "software_delay 5", + "software_delay 10", + "vme_write 0x09 d16 0x00006040 0x00000003" + ], + "name": "init-mtm-16" + } + ], + "name": "mdi2.init" + }, + "name": "mdi2", + "readout": { + "groups": [ + { + "contents": [ + "vme_block_read 0x08 65535 0x00000000" + ], + "name": "readout" + } + ], + "name": "mdi2.readout" + } + }, + { + "init": { + "groups": [ + { + "contents": [ + "vme_write 0x09 d16 0x00006008 0x00000001", + "software_delay 500", + "vme_read 0x09 d16 0x00006008", + "vme_read 0x09 d16 0x0000600e" + ], + "name": "reset" + }, + { + "contents": [ + "vme_write 0x09 d16 0x00006042 0x00000000", + "vme_write 0x09 d16 0x00006044 0x00000003", + "vme_write 0x09 d16 0x0000605c 0x00000001", + "vme_write 0x09 d16 0x00006050 0x00003fc0", + "vme_write 0x09 d16 0x00006054 0x00000181", + "vme_write 0x09 d16 0x00006058 0x00000080", + "vme_write 0x09 d16 0x0000605a 0x00000000", + "vme_write 0x09 d16 0x00006070 0x00000001", + "vme_write 0x09 d16 0x00006072 0x00000bb8" + ], + "name": "module_init_qdc" + }, + { + "contents": [ + "vme_write 0x09 d16 0x00006100 0x00000008", + "vme_write 0x09 d16 0x00006110 0x00000032", + "vme_write 0x09 d16 0x00006112 0x000003e8", + "vme_write 0x09 d16 0x00006114 0x00000bb8", + "vme_write 0x09 d16 0x00006118 0x00000008", + "vme_write 0x09 d16 0x0000611a 0x00000002", + "vme_write 0x09 d16 0x0000611c 0x00000fff", + "vme_write 0x09 d16 0x0000611e 0x00000fff", + "vme_write 0x09 d16 0x00006100 0x00000000", + "vme_write 0x09 d16 0x00006110 0x00000032", + "vme_write 0x09 d16 0x00006112 0x000003e8", + "vme_write 0x09 d16 0x00006114 0x00000bb8", + "vme_write 0x09 d16 0x00006118 0x00000008", + "vme_write 0x09 d16 0x0000611a 0x00000002", + "vme_write 0x09 d16 0x0000611c 0x00000fff", + "vme_write 0x09 d16 0x0000611e 0x00000fff" + ], + "name": "frontend_settings_qdc" + }, + { + "contents": [ + "vme_write 0x09 d16 0x00006010 0x00000000", + "vme_write 0x09 d16 0x0000601c 0x00000000", + "vme_write 0x09 d16 0x0000601e 0x00000003", + "vme_write 0x09 d16 0x00006038 0x00000001", + "vme_write 0x09 d16 0x00006036 0x0000000b", + "vme_write 0x09 d16 0x0000601a 0x00000001", + "vme_write 0x09 d16 0x0000603a 0x00000000", + "vme_write 0x09 d16 0x0000603c 0x00000001", + "vme_write 0x09 d16 0x00006034 0x00000001", + "vme_write 0x09 d16 0x00006020 0x00000080", + "vme_write 0x09 d16 0x00006024 0x00000000" + ], + "name": "vme_interface_settings_qdc" + }, + { + "contents": null, + "name": "module_init_mdll" + }, + { + "contents": [ + "vme_write 0x09 d16 0x00000080 0x000003e8", + "vme_write 0x09 d16 0x00000082 0x000007d0", + "vme_write 0x09 d16 0x00000084 0x00000bb8", + "vme_write 0x09 d16 0x00000086 0x00000000", + "vme_write 0x09 d16 0x00000060 0x00000000", + "vme_write 0x09 d16 0x00000062 0x00000000", + "vme_write 0x09 d16 0x00000064 0x00000000", + "vme_write 0x09 d16 0x00000066 0x00000000", + "vme_write 0x09 d16 0x0000006c 0x00000000", + "vme_write 0x09 d16 0x0000006e 0x00000000" + ], + "name": "counters_setup_mdll" + } + ], + "name": "mdll.init" + }, + "name": "mdll", + "readout": { + "groups": [ + { + "contents": [ + "vme_block_read 0x08 65535 0x00000000" + ], + "name": "readout" + } + ], + "name": "mdll.readout" + } + }, + { + "init": { + "groups": [ + { + "contents": null, + "name": "reset" + }, + { + "contents": null, + "name": "module_init" + }, + { + "contents": null, + "name": "frontend_settings" + }, + { + "contents": null, + "name": "vme_interface_settings" + } + ], + "name": "mdll_counter_events.init" + }, + "name": "mdll_counter_events", + "readout": { + "groups": [ + { + "contents": [ + "vme_block_read 0x08 65535 0x00000000" + ], + "name": "readout" + } + ], + "name": "mdll_counter_events.readout" + } + }, + { + "init": { + "groups": [ + { + "contents": [ + "vme_write 0x09 d16 0x00006008 0x00000001", + "software_delay 500", + "vme_read 0x09 d16 0x00006008", + "vme_read 0x09 d16 0x0000600e", + "vme_write 0x09 d16 0x0000603a 0x00000000", + "vme_write 0x09 d16 0x0000603c 0x00000001", + "vme_write 0x09 d16 0x00006034 0x00000001" + ], + "name": "reset" + }, + { + "contents": [ + "vme_write 0x09 d16 0x00006042 0x00000000", + "vme_write 0x09 d16 0x0000605c 0x00000001", + "vme_write 0x09 d16 0x00006050 0x00003fc0", + "vme_write 0x09 d16 0x00006054 0x00000080", + "vme_write 0x09 d16 0x00006058 0x00000100", + "vme_write 0x09 d16 0x0000605a 0x00000000", + "vme_write 0x09 d16 0x0000605e 0x00000100", + "vme_write 0x09 d16 0x00006060 0x00000000", + "vme_write 0x09 d16 0x00006062 0x00000000", + "vme_write 0x09 d16 0x00006064 0x00000000", + "vme_write 0x09 d16 0x00006066 0x00000000", + "vme_write 0x09 d16 0x00006068 0x00000001", + "vme_write 0x09 d16 0x0000606a 0x00000000", + "vme_write 0x09 d16 0x0000606c 0x00000001", + "vme_write 0x09 d16 0x00006074 0x00000001", + "vme_write 0x09 d16 0x00006070 0x00000000", + "vme_write 0x09 d16 0x00006072 0x000007d0", + "vme_write 0x09 d16 0x00006096 0x00000000", + "vme_write 0x09 d16 0x00006098 0x00000001" + ], + "name": "module_init" + }, + { + "contents": [ + "vme_write 0x09 d16 0x00006100 0x00000008", + "vme_write 0x09 d16 0x00006110 0x0000003c", + "vme_write 0x09 d16 0x00006124 0x0000012c", + "vme_write 0x09 d16 0x0000611a 0x00000064", + "vme_write 0x09 d16 0x00006112 0x00000640", + "vme_write 0x09 d16 0x00006114 0x00000640", + "vme_write 0x09 d16 0x0000611c 0x000003e8", + "vme_write 0x09 d16 0x0000611e 0x000003e8", + "vme_write 0x09 d16 0x0000612a 0x00000000", + "vme_write 0x09 d16 0x00006126 0x00000002", + "vme_write 0x09 d16 0x00006128 0x00000010" + ], + "name": "frontend_settings" + }, + { + "contents": [ + "vme_write 0x09 d16 0x00006010 0x00000000", + "vme_write 0x09 d16 0x0000601c 0x00000000", + "vme_write 0x09 d16 0x0000601e 0x00000003", + "vme_write 0x09 d16 0x00006038 0x00000001", + "vme_write 0x09 d16 0x00006036 0x0000000b", + "vme_write 0x09 d16 0x0000601a 0x00000001", + "vme_write 0x09 d16 0x0000603a 0x00000000", + "vme_write 0x09 d16 0x0000603c 0x00000001", + "vme_write 0x09 d16 0x00006034 0x00000001", + "vme_write 0x09 d16 0x00006020 0x00000080", + "vme_write 0x09 d16 0x00006024 0x00000000" + ], + "name": "vme_interface_settings" + } + ], + "name": "mdpp16_csi.init" + }, + "name": "mdpp16_csi", + "readout": { + "groups": [ + { + "contents": [ + "vme_block_read 0x08 65535 0x00000000" + ], + "name": "readout" + } + ], + "name": "mdpp16_csi.readout" + } + }, + { + "init": { + "groups": [ + { + "contents": [ + "vme_write 0x09 d16 0x00006008 0x00000001", + "software_delay 500", + "vme_read 0x09 d16 0x00006008", + "vme_read 0x09 d16 0x0000600e", + "vme_write 0x09 d16 0x0000603a 0x00000000", + "vme_write 0x09 d16 0x0000603c 0x00000001", + "vme_write 0x09 d16 0x00006034 0x00000001" + ], + "name": "reset" + }, + { + "contents": [ + "vme_write 0x09 d16 0x00006042 0x00000000", + "vme_write 0x09 d16 0x0000605c 0x00000001", + "vme_write 0x09 d16 0x00006050 0x00003fc0", + "vme_write 0x09 d16 0x00006054 0x00000080", + "vme_write 0x09 d16 0x00006058 0x00000100", + "vme_write 0x09 d16 0x0000605a 0x00000000", + "vme_write 0x09 d16 0x0000605e 0x00000100", + "vme_write 0x09 d16 0x00006060 0x00000000", + "vme_write 0x09 d16 0x00006062 0x00000000", + "vme_write 0x09 d16 0x00006064 0x00000000", + "vme_write 0x09 d16 0x00006066 0x00000000", + "vme_write 0x09 d16 0x00006068 0x00000001", + "vme_write 0x09 d16 0x0000606a 0x00000000", + "vme_write 0x09 d16 0x0000606c 0x00000001", + "vme_write 0x09 d16 0x00006074 0x00000001", + "vme_write 0x09 d16 0x00006070 0x00000000", + "vme_write 0x09 d16 0x00006072 0x000007d0", + "vme_write 0x09 d16 0x00006096 0x00000000", + "vme_write 0x09 d16 0x00006098 0x00000001" + ], + "name": "module_init" + }, + { + "contents": [ + "vme_write 0x09 d16 0x00006100 0x00000008", + "vme_write 0x09 d16 0x0000611a 0x00000064", + "vme_write 0x09 d16 0x0000611c 0x00000190", + "vme_write 0x09 d16 0x0000611e 0x00000190", + "vme_write 0x09 d16 0x00006124 0x00000050", + "vme_write 0x09 d16 0x00006100 0x00000008", + "vme_write 0x09 d16 0x00006126 0x00000002" + ], + "name": "frontend_settings" + }, + { + "contents": [ + "vme_write 0x09 d16 0x00006010 0x00000000", + "vme_write 0x09 d16 0x0000601c 0x00000000", + "vme_write 0x09 d16 0x0000601e 0x00000003", + "vme_write 0x09 d16 0x00006038 0x00000001", + "vme_write 0x09 d16 0x00006036 0x0000000b", + "vme_write 0x09 d16 0x0000601a 0x00000001", + "vme_write 0x09 d16 0x0000603a 0x00000000", + "vme_write 0x09 d16 0x0000603c 0x00000001", + "vme_write 0x09 d16 0x00006034 0x00000001", + "vme_write 0x09 d16 0x00006020 0x00000080", + "vme_write 0x09 d16 0x00006024 0x00000000" + ], + "name": "vme_interface_settings" + } + ], + "name": "mdpp16_padc.init" + }, + "name": "mdpp16_padc", + "readout": { + "groups": [ + { + "contents": [ + "vme_block_read 0x08 65535 0x00000000" + ], + "name": "readout" + } + ], + "name": "mdpp16_padc.readout" + } + }, + { + "init": { + "groups": [ + { + "contents": [ + "vme_write 0x09 d16 0x00006008 0x00000001", + "software_delay 500", + "vme_read 0x09 d16 0x00006008", + "vme_read 0x09 d16 0x0000600e", + "vme_write 0x09 d16 0x0000603a 0x00000000", + "vme_write 0x09 d16 0x0000603c 0x00000001", + "vme_write 0x09 d16 0x00006034 0x00000001" + ], + "name": "reset" + }, + { + "contents": [ + "vme_write 0x09 d16 0x00006042 0x00000000", + "vme_write 0x09 d16 0x0000605c 0x00000001", + "vme_write 0x09 d16 0x00006050 0x00003fc0", + "vme_write 0x09 d16 0x00006054 0x00000080", + "vme_write 0x09 d16 0x00006058 0x00000100", + "vme_write 0x09 d16 0x0000605a 0x00000000", + "vme_write 0x09 d16 0x0000605e 0x00000100", + "vme_write 0x09 d16 0x00006060 0x00000000", + "vme_write 0x09 d16 0x00006062 0x00000000", + "vme_write 0x09 d16 0x00006064 0x00000000", + "vme_write 0x09 d16 0x00006066 0x00000000", + "vme_write 0x09 d16 0x00006068 0x00000001", + "vme_write 0x09 d16 0x0000606a 0x00000000", + "vme_write 0x09 d16 0x0000606c 0x00000001", + "vme_write 0x09 d16 0x00006074 0x00000001", + "vme_write 0x09 d16 0x00006070 0x00000000", + "vme_write 0x09 d16 0x00006072 0x00000190", + "vme_write 0x09 d16 0x00006096 0x00000000", + "vme_write 0x09 d16 0x00006098 0x00000001" + ], + "name": "module_init" + }, + { + "contents": [ + "vme_write 0x09 d16 0x00006100 0x00000008", + "vme_write 0x09 d16 0x00006110 0x0000001e", + "vme_write 0x09 d16 0x00006112 0x000003e8", + "vme_write 0x09 d16 0x00006114 0x000007d0", + "vme_write 0x09 d16 0x00006118 0x00000010", + "vme_write 0x09 d16 0x0000611a 0x00000002", + "vme_write 0x09 d16 0x0000611c 0x000004ff", + "vme_write 0x09 d16 0x0000611e 0x000004ff" + ], + "name": "frontend_settings" + }, + { + "contents": [ + "vme_write 0x09 d16 0x00006010 0x00000000", + "vme_write 0x09 d16 0x0000601c 0x00000000", + "vme_write 0x09 d16 0x0000601e 0x00000003", + "vme_write 0x09 d16 0x00006038 0x00000001", + "vme_write 0x09 d16 0x00006036 0x0000000b", + "vme_write 0x09 d16 0x0000601a 0x00000001", + "vme_write 0x09 d16 0x0000603a 0x00000000", + "vme_write 0x09 d16 0x0000603c 0x00000001", + "vme_write 0x09 d16 0x00006034 0x00000001", + "vme_write 0x09 d16 0x00006020 0x00000080", + "vme_write 0x09 d16 0x00006024 0x00000000" + ], + "name": "vme_interface_settings" + }, + { + "contents": [ + "vme_read 0x09 d16 0x0000600e", + "vme_write 0x09 d16 0x00006044 0x00000000", + "vme_write 0x09 d16 0x00006100 0x00000008", + "vme_write 0x09 d16 0x00006146 0x00000005", + "vme_write 0x09 d16 0x00006148 0x0000001e", + "vme_write 0x09 d16 0x0000614a 0x00000000" + ], + "name": "streaming_and_sampling" + } + ], + "name": "mdpp16_qdc.init" + }, + "name": "mdpp16_qdc", + "readout": { + "groups": [ + { + "contents": [ + "vme_block_read 0x08 65535 0x00000000" + ], + "name": "readout" + } + ], + "name": "mdpp16_qdc.readout" + } + }, + { + "init": { + "groups": [ + { + "contents": [ + "vme_write 0x09 d16 0x00006008 0x00000001", + "software_delay 500", + "vme_read 0x09 d16 0x00006008", + "vme_read 0x09 d16 0x0000600e", + "vme_write 0x09 d16 0x0000603a 0x00000000", + "vme_write 0x09 d16 0x0000603c 0x00000001", + "vme_write 0x09 d16 0x00006034 0x00000001" + ], + "name": "reset" + }, + { + "contents": [ + "vme_write 0x09 d16 0x00006042 0x00000000", + "vme_write 0x09 d16 0x0000605c 0x00000001", + "vme_write 0x09 d16 0x00006050 0x00003fc0", + "vme_write 0x09 d16 0x00006054 0x00000080", + "vme_write 0x09 d16 0x00006058 0x00000100", + "vme_write 0x09 d16 0x0000605a 0x00000000", + "vme_write 0x09 d16 0x0000605e 0x00000100", + "vme_write 0x09 d16 0x00006060 0x00000000", + "vme_write 0x09 d16 0x00006062 0x00000000", + "vme_write 0x09 d16 0x00006064 0x00000000", + "vme_write 0x09 d16 0x00006066 0x00000000", + "vme_write 0x09 d16 0x00006068 0x00000001", + "vme_write 0x09 d16 0x0000606a 0x00000000", + "vme_write 0x09 d16 0x0000606c 0x00000001", + "vme_write 0x09 d16 0x00006074 0x00000001", + "vme_write 0x09 d16 0x00006070 0x00000000", + "vme_write 0x09 d16 0x00006072 0x00000190", + "vme_write 0x09 d16 0x00006096 0x00000000", + "vme_write 0x09 d16 0x00006098 0x00000001" + ], + "name": "module_init" + }, + { + "contents": [ + "vme_write 0x09 d16 0x00006100 0x00000008", + "vme_write 0x09 d16 0x00006110 0x00000014", + "vme_write 0x09 d16 0x0000611a 0x000000c8", + "vme_write 0x09 d16 0x0000611c 0x00000100", + "vme_write 0x09 d16 0x0000611e 0x00000100", + "vme_write 0x09 d16 0x00006124 0x000000c8", + "vme_write 0x09 d16 0x0000612a 0x00000000", + "vme_write 0x09 d16 0x00006126 0x00000002", + "vme_write 0x09 d16 0x00006128 0x00000010" + ], + "name": "frontend_settings" + }, + { + "contents": [ + "vme_write 0x09 d16 0x00006010 0x00000000", + "vme_write 0x09 d16 0x0000601c 0x00000000", + "vme_write 0x09 d16 0x0000601e 0x00000003", + "vme_write 0x09 d16 0x00006038 0x00000001", + "vme_write 0x09 d16 0x00006036 0x0000000b", + "vme_write 0x09 d16 0x0000601a 0x00000001", + "vme_write 0x09 d16 0x0000603a 0x00000000", + "vme_write 0x09 d16 0x0000603c 0x00000001", + "vme_write 0x09 d16 0x00006034 0x00000001", + "vme_write 0x09 d16 0x00006020 0x00000080", + "vme_write 0x09 d16 0x00006024 0x00000000" + ], + "name": "vme_interface_settings" + } + ], + "name": "mdpp16_rcp.init" + }, + "name": "mdpp16_rcp", + "readout": { + "groups": [ + { + "contents": [ + "vme_block_read 0x08 65535 0x00000000" + ], + "name": "readout" + } + ], + "name": "mdpp16_rcp.readout" + } + }, + { + "init": { + "groups": [ + { + "contents": [ + "vme_write 0x09 d16 0x00006008 0x00000001", + "software_delay 500", + "vme_read 0x09 d16 0x00006008", + "vme_read 0x09 d16 0x0000600e", + "vme_write 0x09 d16 0x0000603a 0x00000000", + "vme_write 0x09 d16 0x0000603c 0x00000001", + "vme_write 0x09 d16 0x00006034 0x00000001" + ], + "name": "reset" + }, + { + "contents": [ + "vme_write 0x09 d16 0x00006042 0x00000000", + "vme_write 0x09 d16 0x0000605c 0x00000001", + "vme_write 0x09 d16 0x00006050 0x00003fc0", + "vme_write 0x09 d16 0x00006054 0x00000080", + "vme_write 0x09 d16 0x00006058 0x00000100", + "vme_write 0x09 d16 0x0000605a 0x00000000", + "vme_write 0x09 d16 0x0000605e 0x00000100", + "vme_write 0x09 d16 0x00006060 0x00000000", + "vme_write 0x09 d16 0x00006062 0x00000000", + "vme_write 0x09 d16 0x00006064 0x00000000", + "vme_write 0x09 d16 0x00006066 0x00000000", + "vme_write 0x09 d16 0x00006068 0x00000001", + "vme_write 0x09 d16 0x0000606a 0x00000000", + "vme_write 0x09 d16 0x0000606c 0x00000001", + "vme_write 0x09 d16 0x00006074 0x00000001", + "vme_write 0x09 d16 0x00006070 0x00000000", + "vme_write 0x09 d16 0x00006072 0x00000190", + "vme_write 0x09 d16 0x00006096 0x00000000", + "vme_write 0x09 d16 0x00006098 0x00000001" + ], + "name": "module_init" + }, + { + "contents": [ + "vme_write 0x09 d16 0x00006100 0x00000008", + "vme_write 0x09 d16 0x00006110 0x00000014", + "vme_write 0x09 d16 0x00006124 0x000000a0", + "vme_write 0x09 d16 0x00006112 0x000007d0", + "vme_write 0x09 d16 0x00006114 0x000007d0", + "vme_write 0x09 d16 0x0000611a 0x000000c8", + "vme_write 0x09 d16 0x0000611c 0x000001f4", + "vme_write 0x09 d16 0x0000611e 0x000001f4", + "vme_write 0x09 d16 0x0000612a 0x00000000", + "vme_write 0x09 d16 0x00006126 0x00000002", + "vme_write 0x09 d16 0x00006128 0x00000010" + ], + "name": "frontend_settings" + }, + { + "contents": [ + "vme_write 0x09 d16 0x00006010 0x00000000", + "vme_write 0x09 d16 0x0000601c 0x00000000", + "vme_write 0x09 d16 0x0000601e 0x00000003", + "vme_write 0x09 d16 0x00006038 0x00000001", + "vme_write 0x09 d16 0x00006036 0x0000000b", + "vme_write 0x09 d16 0x0000601a 0x00000001", + "vme_write 0x09 d16 0x0000603a 0x00000000", + "vme_write 0x09 d16 0x0000603c 0x00000001", + "vme_write 0x09 d16 0x00006034 0x00000001", + "vme_write 0x09 d16 0x00006020 0x00000080", + "vme_write 0x09 d16 0x00006024 0x00000000" + ], + "name": "vme_interface_settings" + }, + { + "contents": [ + "vme_read 0x09 d16 0x0000600e", + "vme_write 0x09 d16 0x00006044 0x00000000", + "vme_write 0x09 d16 0x00006100 0x00000008", + "vme_write 0x09 d16 0x00006146 0x00000005", + "vme_write 0x09 d16 0x00006148 0x0000001e", + "vme_write 0x09 d16 0x0000614a 0x00000000" + ], + "name": "streaming_and_sampling" + } + ], + "name": "mdpp16_scp.init" + }, + "name": "mdpp16_scp", + "readout": { + "groups": [ + { + "contents": [ + "vme_block_read 0x08 65535 0x00000000" + ], + "name": "readout" + } + ], + "name": "mdpp16_scp.readout" + } + }, + { + "init": { + "groups": [ + { + "contents": [ + "vme_write 0x09 d16 0x00006008 0x00000001", + "software_delay 500", + "vme_read 0x09 d16 0x00006008", + "vme_read 0x09 d16 0x0000600e", + "vme_write 0x09 d16 0x00006044 0x00000004" + ], + "name": "reset" + }, + { + "contents": [ + "vme_write 0x09 d16 0x00006042 0x00000000", + "vme_write 0x09 d16 0x0000605c 0x00000001", + "vme_write 0x09 d16 0x00006050 0x00003fec", + "vme_write 0x09 d16 0x00006054 0x00000028", + "vme_write 0x09 d16 0x00006058 0x00000080", + "vme_write 0x09 d16 0x0000605e 0x00000080", + "vme_write 0x09 d16 0x00006060 0x00000000", + "vme_write 0x09 d16 0x00006062 0x00000000", + "vme_write 0x09 d16 0x00006064 0x00000000", + "vme_write 0x09 d16 0x00006066 0x00000000", + "vme_write 0x09 d16 0x00006068 0x00000001", + "vme_write 0x09 d16 0x0000606a 0x00000000", + "vme_write 0x09 d16 0x0000606c 0x00000001", + "vme_write 0x09 d16 0x00006074 0x00000004", + "vme_write 0x09 d16 0x00006070 0x00000000", + "vme_write 0x09 d16 0x00006072 0x000003e8", + "vme_write 0x09 d16 0x00006096 0x00000000", + "vme_write 0x09 d16 0x00006098 0x00000001" + ], + "name": "module_init" + }, + { + "contents": [ + "vme_write 0x09 d16 0x00006100 0x00000008", + "vme_write 0x09 d16 0x00006110 0x00000002", + "vme_write 0x09 d16 0x00006124 0x00000064", + "vme_write 0x09 d16 0x00006112 0x000007d0", + "vme_write 0x09 d16 0x00006114 0x000007d0", + "vme_write 0x09 d16 0x0000611a 0x000000c8", + "vme_write 0x09 d16 0x0000611c 0x000005dc", + "vme_write 0x09 d16 0x0000611e 0x000005dc", + "vme_write 0x09 d16 0x0000612a 0x00000000", + "vme_write 0x09 d16 0x00006126 0x00000002", + "vme_write 0x09 d16 0x00006128 0x00000010" + ], + "name": "frontend_settings" + }, + { + "contents": [ + "vme_write 0x09 d16 0x00006010 0x00000000", + "vme_write 0x09 d16 0x0000601c 0x00000000", + "vme_write 0x09 d16 0x0000601e 0x00000003", + "vme_write 0x09 d16 0x00006038 0x00000001", + "vme_write 0x09 d16 0x00006036 0x0000000b", + "vme_write 0x09 d16 0x0000601a 0x00000001", + "vme_write 0x09 d16 0x0000603a 0x00000000", + "vme_write 0x09 d16 0x0000603c 0x00000001", + "vme_write 0x09 d16 0x00006034 0x00000001", + "vme_write 0x09 d16 0x00006020 0x00000080", + "vme_write 0x09 d16 0x00006024 0x00000000" + ], + "name": "vme_interface_settings" + } + ], + "name": "mdpp16_scp_streaming.init" + }, + "name": "mdpp16_scp_streaming", + "readout": { + "groups": [ + { + "contents": [ + "vme_block_read 0x20 60000 0x00000000 2" + ], + "name": "readout" + } + ], + "name": "mdpp16_scp_streaming.readout" + } + }, + { + "init": { + "groups": [ + { + "contents": [ + "vme_write 0x09 d16 0x00006008 0x00000001", + "software_delay 500", + "vme_read 0x09 d16 0x00006008", + "vme_read 0x09 d16 0x0000600e", + "vme_write 0x09 d16 0x0000603a 0x00000000", + "vme_write 0x09 d16 0x0000603c 0x00000001", + "vme_write 0x09 d16 0x00006034 0x00000001" + ], + "name": "reset" + }, + { + "contents": [ + "vme_write 0x09 d16 0x00006042 0x00000000", + "vme_write 0x09 d16 0x0000605c 0x00000001", + "vme_write 0x09 d16 0x00006050 0x00003fc0", + "vme_write 0x09 d16 0x00006054 0x00000080", + "vme_write 0x09 d16 0x00006058 0x00000300", + "vme_write 0x09 d16 0x0000605e 0x00000300", + "vme_write 0x09 d16 0x00006060 0x00000000", + "vme_write 0x09 d16 0x00006062 0x00000000", + "vme_write 0x09 d16 0x00006064 0x00000000", + "vme_write 0x09 d16 0x00006066 0x00000000", + "vme_write 0x09 d16 0x00006068 0x00000001", + "vme_write 0x09 d16 0x0000606a 0x00000000", + "vme_write 0x09 d16 0x0000606c 0x00000001", + "vme_write 0x09 d16 0x00006074 0x00000001", + "vme_write 0x09 d16 0x00006070 0x00000000", + "vme_write 0x09 d16 0x00006072 0x00000bbd", + "vme_write 0x09 d16 0x00006096 0x00000000", + "vme_write 0x09 d16 0x00006098 0x00000001" + ], + "name": "module_init" + }, + { + "contents": [ + "vme_write 0x09 d16 0x00006100 0x00000008", + "vme_write 0x09 d16 0x0000611a 0x000000c8", + "vme_write 0x09 d16 0x00006124 0x00000050", + "vme_write 0x09 d16 0x0000611c 0x00000190", + "vme_write 0x09 d16 0x0000611e 0x00000190", + "vme_write 0x09 d16 0x00006120 0x00000190", + "vme_write 0x09 d16 0x00006122 0x00000190", + "vme_write 0x09 d16 0x00006112 0x00000020", + "vme_write 0x09 d16 0x00006126 0x00000002" + ], + "name": "frontend_settings" + }, + { + "contents": [ + "vme_write 0x09 d16 0x00006010 0x00000000", + "vme_write 0x09 d16 0x0000601c 0x00000000", + "vme_write 0x09 d16 0x0000601e 0x00000003", + "vme_write 0x09 d16 0x00006038 0x00000001", + "vme_write 0x09 d16 0x00006036 0x0000000b", + "vme_write 0x09 d16 0x0000601a 0x00000001", + "vme_write 0x09 d16 0x0000603a 0x00000000", + "vme_write 0x09 d16 0x0000603c 0x00000001", + "vme_write 0x09 d16 0x00006034 0x00000001", + "vme_write 0x09 d16 0x00006020 0x00000080", + "vme_write 0x09 d16 0x00006024 0x00000000" + ], + "name": "vme_interface_settings" + } + ], + "name": "mdpp32_padc.init" + }, + "name": "mdpp32_padc", + "readout": { + "groups": [ + { + "contents": [ + "vme_block_read 0x08 65535 0x00000000" + ], + "name": "readout" + } + ], + "name": "mdpp32_padc.readout" + } + }, + { + "init": { + "groups": [ + { + "contents": [ + "vme_write 0x09 d16 0x00006008 0x00000001", + "software_delay 500", + "vme_read 0x09 d16 0x00006008", + "vme_read 0x09 d16 0x0000600e", + "vme_write 0x09 d16 0x0000603a 0x00000000", + "vme_write 0x09 d16 0x0000603c 0x00000001", + "vme_write 0x09 d16 0x00006034 0x00000001" + ], + "name": "reset" + }, + { + "contents": [ + "vme_write 0x09 d16 0x00006042 0x00000000", + "vme_write 0x09 d16 0x00006044 0x00000003", + "vme_write 0x09 d16 0x0000605c 0x00000001", + "vme_write 0x09 d16 0x00006050 0x00003fc0", + "vme_write 0x09 d16 0x00006054 0x00000080", + "vme_write 0x09 d16 0x00006058 0x00000300", + "vme_write 0x09 d16 0x0000605e 0x00000300", + "vme_write 0x09 d16 0x00006060 0x00000000", + "vme_write 0x09 d16 0x00006062 0x00000000", + "vme_write 0x09 d16 0x00006064 0x00000000", + "vme_write 0x09 d16 0x00006066 0x00000000", + "vme_write 0x09 d16 0x00006068 0x00000001", + "vme_write 0x09 d16 0x0000606a 0x00000000", + "vme_write 0x09 d16 0x0000606c 0x00000001", + "vme_write 0x09 d16 0x00006074 0x00000001", + "vme_write 0x09 d16 0x00006070 0x00000000", + "vme_write 0x09 d16 0x00006072 0x00000190", + "vme_write 0x09 d16 0x00006096 0x00000000", + "vme_write 0x09 d16 0x00006098 0x00000001" + ], + "name": "module_init" + }, + { + "contents": [ + "vme_write 0x09 d16 0x00006100 0x00000008", + "vme_write 0x09 d16 0x00006110 0x0000001e", + "vme_write 0x09 d16 0x00006112 0x000003e8", + "vme_write 0x09 d16 0x00006114 0x000007d0", + "vme_write 0x09 d16 0x00006118 0x00000010", + "vme_write 0x09 d16 0x0000611a 0x00000002", + "vme_write 0x09 d16 0x0000611c 0x000004ff", + "vme_write 0x09 d16 0x0000611e 0x000004ff", + "vme_write 0x09 d16 0x00006120 0x000004ff", + "vme_write 0x09 d16 0x00006122 0x000004ff" + ], + "name": "frontend_settings" + }, + { + "contents": [ + "vme_write 0x09 d16 0x00006010 0x00000000", + "vme_write 0x09 d16 0x0000601c 0x00000000", + "vme_write 0x09 d16 0x0000601e 0x00000003", + "vme_write 0x09 d16 0x00006038 0x00000001", + "vme_write 0x09 d16 0x00006036 0x0000000b", + "vme_write 0x09 d16 0x0000601a 0x00000001", + "vme_write 0x09 d16 0x0000603a 0x00000000", + "vme_write 0x09 d16 0x0000603c 0x00000001", + "vme_write 0x09 d16 0x00006034 0x00000001", + "vme_write 0x09 d16 0x00006020 0x00000080", + "vme_write 0x09 d16 0x00006024 0x00000000" + ], + "name": "vme_interface_settings" + } + ], + "name": "mdpp32_qdc.init" + }, + "name": "mdpp32_qdc", + "readout": { + "groups": [ + { + "contents": [ + "vme_block_read 0x08 65535 0x00000000" + ], + "name": "readout" + } + ], + "name": "mdpp32_qdc.readout" + } + }, + { + "init": { + "groups": [ + { + "contents": [ + "vme_write 0x09 d16 0x00006008 0x00000001", + "software_delay 500", + "vme_read 0x09 d16 0x00006008", + "vme_read 0x09 d16 0x0000600e", + "vme_write 0x09 d16 0x0000603a 0x00000000", + "vme_write 0x09 d16 0x0000603c 0x00000001", + "vme_write 0x09 d16 0x00006034 0x00000001" + ], + "name": "reset" + }, + { + "contents": [ + "vme_write 0x09 d16 0x00006042 0x00000000", + "vme_write 0x09 d16 0x0000605c 0x00000001", + "vme_write 0x09 d16 0x00006050 0x00003fc0", + "vme_write 0x09 d16 0x00006054 0x00000080", + "vme_write 0x09 d16 0x00006058 0x00000300", + "vme_write 0x09 d16 0x0000605e 0x00000300", + "vme_write 0x09 d16 0x00006060 0x00000000", + "vme_write 0x09 d16 0x00006062 0x00000000", + "vme_write 0x09 d16 0x00006064 0x00000000", + "vme_write 0x09 d16 0x00006066 0x00000000", + "vme_write 0x09 d16 0x00006068 0x00000001", + "vme_write 0x09 d16 0x0000606a 0x00000000", + "vme_write 0x09 d16 0x0000606c 0x00000001", + "vme_write 0x09 d16 0x00006074 0x00000001", + "vme_write 0x09 d16 0x00006070 0x00000000", + "vme_write 0x09 d16 0x00006072 0x00000190", + "vme_write 0x09 d16 0x00006096 0x00000000", + "vme_write 0x09 d16 0x00006098 0x00000001" + ], + "name": "module_init" + }, + { + "contents": [ + "vme_write 0x09 d16 0x00006100 0x00000008", + "vme_write 0x09 d16 0x00006110 0x00000008", + "vme_write 0x09 d16 0x00006124 0x000000a0", + "vme_write 0x09 d16 0x0000611a 0x000000c8", + "vme_write 0x09 d16 0x00006112 0x000007d0", + "vme_write 0x09 d16 0x00006114 0x000007d0", + "vme_write 0x09 d16 0x00006116 0x000007d0", + "vme_write 0x09 d16 0x00006118 0x000007d0", + "vme_write 0x09 d16 0x0000611c 0x000007d0", + "vme_write 0x09 d16 0x0000611e 0x000007d0", + "vme_write 0x09 d16 0x00006120 0x000007d0", + "vme_write 0x09 d16 0x00006122 0x000007d0", + "vme_write 0x09 d16 0x0000612a 0x00000004", + "vme_write 0x09 d16 0x00006126 0x00000002", + "vme_write 0x09 d16 0x00006128 0x00000010" + ], + "name": "frontend_settings" + }, + { + "contents": [ + "vme_write 0x09 d16 0x00006010 0x00000000", + "vme_write 0x09 d16 0x0000601c 0x00000000", + "vme_write 0x09 d16 0x0000601e 0x00000003", + "vme_write 0x09 d16 0x00006038 0x00000001", + "vme_write 0x09 d16 0x00006036 0x0000000b", + "vme_write 0x09 d16 0x0000601a 0x00000001", + "vme_write 0x09 d16 0x0000603a 0x00000000", + "vme_write 0x09 d16 0x0000603c 0x00000001", + "vme_write 0x09 d16 0x00006034 0x00000001", + "vme_write 0x09 d16 0x00006020 0x00000080", + "vme_write 0x09 d16 0x00006024 0x00000000" + ], + "name": "vme_interface_settings" + } + ], + "name": "mdpp32_scp.init" + }, + "name": "mdpp32_scp", + "readout": { + "groups": [ + { + "contents": [ + "vme_block_read 0x08 65535 0x00000000" + ], + "name": "readout" + } + ], + "name": "mdpp32_scp.readout" + } + }, + { + "init": { + "groups": [ + { + "contents": [ + "vme_write 0x09 d16 0x00006008 0x00000001", + "software_delay 500", + "vme_read 0x09 d16 0x00006008", + "vme_read 0x09 d16 0x0000600e", + "vme_write 0x09 d16 0x0000603a 0x00000000", + "vme_write 0x09 d16 0x0000603c 0x00000001", + "vme_write 0x09 d16 0x00006034 0x00000001" + ], + "name": "reset" + }, + { + "contents": [ + "vme_write 0x09 d16 0x00006042 0x00000000", + "vme_write 0x09 d16 0x0000605c 0x00000001", + "vme_write 0x09 d16 0x00006050 0x00003fc0", + "vme_write 0x09 d16 0x00006054 0x00000080", + "vme_write 0x09 d16 0x00006058 0x00000300", + "vme_write 0x09 d16 0x0000605e 0x00000300", + "vme_write 0x09 d16 0x00006060 0x00000000", + "vme_write 0x09 d16 0x00006062 0x00000000", + "vme_write 0x09 d16 0x00006064 0x00000000", + "vme_write 0x09 d16 0x00006066 0x00000000", + "vme_write 0x09 d16 0x00006068 0x00000001", + "vme_write 0x09 d16 0x0000606a 0x00000000", + "vme_write 0x09 d16 0x0000606c 0x00000001", + "vme_write 0x09 d16 0x00006074 0x00000001", + "vme_write 0x09 d16 0x00006070 0x00000000", + "vme_write 0x09 d16 0x00006072 0x00000190", + "vme_write 0x09 d16 0x00006096 0x00000000", + "vme_write 0x09 d16 0x00006098 0x00000001" + ], + "name": "module_init" + }, + { + "contents": [ + "vme_write 0x09 d16 0x00006100 0x00000008", + "vme_write 0x09 d16 0x00006110 0x00000008", + "vme_write 0x09 d16 0x00006124 0x000000a0", + "vme_write 0x09 d16 0x0000611a 0x000000c8", + "vme_write 0x09 d16 0x00006112 0x000007d0", + "vme_write 0x09 d16 0x00006114 0x000007d0", + "vme_write 0x09 d16 0x00006116 0x000007d0", + "vme_write 0x09 d16 0x00006118 0x000007d0", + "vme_write 0x09 d16 0x0000611c 0x000007d0", + "vme_write 0x09 d16 0x0000611e 0x000007d0", + "vme_write 0x09 d16 0x00006120 0x000007d0", + "vme_write 0x09 d16 0x00006122 0x000007d0", + "vme_write 0x09 d16 0x0000612a 0x00000004", + "vme_write 0x09 d16 0x00006126 0x00000002", + "vme_write 0x09 d16 0x00006128 0x00000010" + ], + "name": "frontend_settings" + }, + { + "contents": [ + "vme_write 0x09 d16 0x00006010 0x00000000", + "vme_write 0x09 d16 0x0000601c 0x00000000", + "vme_write 0x09 d16 0x0000601e 0x00000003", + "vme_write 0x09 d16 0x00006038 0x00000001", + "vme_write 0x09 d16 0x00006036 0x0000000b", + "vme_write 0x09 d16 0x0000601a 0x00000001", + "vme_write 0x09 d16 0x0000603a 0x00000000", + "vme_write 0x09 d16 0x0000603c 0x00000001", + "vme_write 0x09 d16 0x00006034 0x00000001", + "vme_write 0x09 d16 0x00006020 0x00000080", + "vme_write 0x09 d16 0x00006024 0x00000000" + ], + "name": "vme_interface_settings" + } + ], + "name": "mdpp32_scp_streaming.init" + }, + "name": "mdpp32_scp_streaming", + "readout": { + "groups": [ + { + "contents": [ + "vme_block_read 0x08 65535 0x00000000" + ], + "name": "readout" + } + ], + "name": "mdpp32_scp_streaming.readout" + } + }, + { + "init": { + "groups": [ + { + "contents": null, + "name": "reset" + }, + { + "contents": [ + "vme_write 0x09 d16 0x00006090 0x00000003" + ], + "name": "module_init" + } + ], + "name": "mesytec_counter.init" + }, + "name": "mesytec_counter", + "readout": { + "groups": [ + { + "contents": [ + "vme_read 0x09 d16 0x00006092", + "vme_read 0x09 d16 0x00006094" + ], + "name": "readout" + } + ], + "name": "mesytec_counter.readout" + } + }, + { + "init": { + "groups": [ + { + "contents": [ + "vme_write 0x09 d16 0x00006008 0x00000001", + "software_delay 500", + "vme_read 0x09 d16 0x00006008", + "vme_read 0x09 d16 0x0000600e", + "vme_write 0x09 d16 0x0000603a 0x00000000", + "vme_write 0x09 d16 0x0000603c 0x00000001", + "vme_write 0x09 d16 0x00006034 0x00000001" + ], + "name": "reset" + }, + { + "contents": [ + "vme_write 0x09 d16 0x00006062 0x00000018", + "vme_write 0x09 d16 0x00006064 0x00000000", + "vme_write 0x09 d16 0x00006066 0x00000001", + "vme_write 0x09 d16 0x00006068 0x00000000", + "vme_write 0x09 d16 0x0000606a 0x00000000", + "vme_write 0x09 d16 0x0000606c 0x00000000", + "vme_write 0x09 d16 0x0000606e 0x00000000", + "vme_write 0x09 d16 0x00006070 0x00000000", + "vme_write 0x09 d16 0x00006072 0x00000020", + "vme_write 0x09 d16 0x00006096 0x00000000", + "vme_write 0x09 d16 0x00006098 0x00000001", + "vme_write 0x09 d16 0x00004000 0x00000000", + "vme_write 0x09 d16 0x00004002 0x00000000", + "vme_write 0x09 d16 0x00004004 0x00000000", + "vme_write 0x09 d16 0x00004006 0x00000000", + "vme_write 0x09 d16 0x00004008 0x00000000", + "vme_write 0x09 d16 0x0000400a 0x00000000", + "vme_write 0x09 d16 0x0000400c 0x00000000", + "vme_write 0x09 d16 0x0000400e 0x00000000", + "vme_write 0x09 d16 0x00004010 0x00000000", + "vme_write 0x09 d16 0x00004012 0x00000000", + "vme_write 0x09 d16 0x00004014 0x00000000", + "vme_write 0x09 d16 0x00004016 0x00000000", + "vme_write 0x09 d16 0x00004018 0x00000000", + "vme_write 0x09 d16 0x0000401a 0x00000000", + "vme_write 0x09 d16 0x0000401c 0x00000000", + "vme_write 0x09 d16 0x0000401e 0x00000000", + "vme_write 0x09 d16 0x00004020 0x00000000", + "vme_write 0x09 d16 0x00004022 0x00000000", + "vme_write 0x09 d16 0x00004024 0x00000000", + "vme_write 0x09 d16 0x00004026 0x00000000", + "vme_write 0x09 d16 0x00004028 0x00000000", + "vme_write 0x09 d16 0x0000402a 0x00000000", + "vme_write 0x09 d16 0x0000402c 0x00000000", + "vme_write 0x09 d16 0x0000402e 0x00000000", + "vme_write 0x09 d16 0x00004030 0x00000000", + "vme_write 0x09 d16 0x00004032 0x00000000", + "vme_write 0x09 d16 0x00004034 0x00000000", + "vme_write 0x09 d16 0x00004036 0x00000000", + "vme_write 0x09 d16 0x00004038 0x00000000", + "vme_write 0x09 d16 0x0000403a 0x00000000", + "vme_write 0x09 d16 0x0000403c 0x00000000", + "vme_write 0x09 d16 0x0000403e 0x00000000", + "vme_write 0x09 d16 0x0000604c 0x00000000", + "vme_write 0x09 d16 0x00006040 0x00000000", + "vme_write 0x09 d16 0x00006044 0x00000082", + "vme_write 0x09 d16 0x00006046 0x00000082", + "vme_write 0x09 d16 0x00006050 0x000000ff", + "vme_write 0x09 d16 0x00006052 0x000000ff", + "vme_write 0x09 d16 0x00006054 0x00000000", + "vme_write 0x09 d16 0x00006056 0x00000000", + "vme_write 0x09 d16 0x00006060 0x00000000", + "vme_write 0x09 d16 0x0000604a 0x00000000" + ], + "name": "module_init" + }, + { + "contents": [ + "vme_write 0x09 d16 0x00006010 0x00000000", + "vme_write 0x09 d16 0x0000601c 0x00000000", + "vme_write 0x09 d16 0x0000601e 0x00000003", + "vme_write 0x09 d16 0x00006038 0x00000001", + "vme_write 0x09 d16 0x00006036 0x0000000b", + "vme_write 0x09 d16 0x0000601a 0x00000001", + "vme_write 0x09 d16 0x0000603a 0x00000000", + "vme_write 0x09 d16 0x0000603c 0x00000001", + "vme_write 0x09 d16 0x00006034 0x00000001", + "vme_write 0x09 d16 0x00006020 0x00000080", + "vme_write 0x09 d16 0x00006024 0x00000000" + ], + "name": "vme_interface_settings" + } + ], + "name": "mqdc32.init" + }, + "name": "mqdc32", + "readout": { + "groups": [ + { + "contents": [ + "vme_block_read 0x08 65535 0x00000000" + ], + "name": "readout" + } + ], + "name": "mqdc32.readout" + } + }, + { + "init": { + "groups": [ + { + "contents": [ + "vme_write 0x09 d16 0x00006008 0x00000001", + "software_delay 500", + "vme_read 0x09 d16 0x00006008", + "vme_read 0x09 d16 0x0000600e", + "vme_write 0x09 d16 0x0000603a 0x00000000", + "vme_write 0x09 d16 0x0000603c 0x00000001", + "vme_write 0x09 d16 0x00006034 0x00000001" + ], + "name": "reset" + }, + { + "contents": [ + "vme_write 0x09 d16 0x00006040 0x00000000", + "vme_write 0x09 d16 0x00006042 0x00000002", + "vme_write 0x09 d16 0x0000605c 0x00000003", + "vme_write 0x09 d16 0x00006050 0x00003f9c", + "vme_write 0x09 d16 0x00006052 0x00003f9c", + "vme_write 0x09 d16 0x00006054 0x000000c8", + "vme_write 0x09 d16 0x00006056 0x000000c8", + "vme_write 0x09 d16 0x00006058 0x00000001", + "vme_write 0x09 d16 0x0000605a 0x00000002", + "vme_write 0x09 d16 0x00006062 0x00000000", + "vme_write 0x09 d16 0x00006064 0x00000000", + "vme_write 0x09 d16 0x00006068 0x00000000", + "vme_write 0x09 d16 0x0000606a 0x00000000", + "vme_write 0x09 d16 0x0000606e 0x00000000", + "vme_write 0x09 d16 0x00006060 0x00000000", + "vme_write 0x09 d16 0x00006078 0x00000069", + "vme_write 0x09 d16 0x0000607a 0x00000069", + "vme_write 0x09 d16 0x00006070 0x00000000", + "vme_write 0x09 d16 0x00006096 0x00000000", + "vme_write 0x09 d16 0x00006098 0x00000001", + "vme_write 0x09 d16 0x00006044 0x00000000" + ], + "name": "module_init" + }, + { + "contents": [ + "vme_write 0x09 d16 0x00006010 0x00000000", + "vme_write 0x09 d16 0x0000601c 0x00000000", + "vme_write 0x09 d16 0x0000601e 0x00000003", + "vme_write 0x09 d16 0x00006038 0x00000001", + "vme_write 0x09 d16 0x00006036 0x0000000b", + "vme_write 0x09 d16 0x0000601a 0x00000001", + "vme_write 0x09 d16 0x0000603a 0x00000000", + "vme_write 0x09 d16 0x0000603c 0x00000001", + "vme_write 0x09 d16 0x00006034 0x00000001", + "vme_write 0x09 d16 0x00006020 0x00000080", + "vme_write 0x09 d16 0x00006024 0x00000000" + ], + "name": "vme_interface_settings" + } + ], + "name": "mtdc32.init" + }, + "name": "mtdc32", + "readout": { + "groups": [ + { + "contents": [ + "vme_block_read 0x08 65535 0x00000000" + ], + "name": "readout" + } + ], + "name": "mtdc32.readout" + } + }, + { + "init": { + "groups": [ + { + "contents": [ + "vme_read 0x09 d16 0x00000108", + "vme_read 0x09 d16 0x00000054", + "vme_read 0x09 d16 0x00000058", + "vme_read 0x09 d16 0x00000056" + ], + "name": "reset" + }, + { + "contents": [ + "vme_write 0x09 d16 0x00000052 0x00000000", + "vme_write 0x09 d16 0x0000001c 0x00000001", + "vme_write 0x09 d16 0x0000001e 0x00000001", + "vme_write 0x09 d16 0x00000020 0x00000001", + "vme_write 0x09 d16 0x00000022 0x00000001", + "vme_write 0x09 d16 0x00000000 0x00000000", + "vme_write 0x09 d16 0x00000002 0x00000000", + "vme_write 0x09 d16 0x00000004 0x00000000", + "vme_write 0x09 d16 0x00000006 0x00000000", + "vme_write 0x09 d16 0x00000010 0x000003e8", + "vme_write 0x09 d16 0x00000012 0x000003e8", + "vme_write 0x09 d16 0x00000014 0x000003e8", + "vme_write 0x09 d16 0x00000016 0x000003e8" + ], + "name": "module_init" + } + ], + "name": "mvhv-4.init" + }, + "name": "mvhv-4", + "readout": { + "groups": [ + { + "contents": [ + "vme_read 0x09 d16 0x00000000", + "vme_read 0x09 d16 0x00000002", + "vme_read 0x09 d16 0x00000004", + "vme_read 0x09 d16 0x00000006", + "vme_read 0x09 d16 0x00000024", + "vme_read 0x09 d16 0x00000026", + "vme_read 0x09 d16 0x00000028", + "vme_read 0x09 d16 0x0000002a", + "vme_read 0x09 d16 0x00000034", + "vme_read 0x09 d16 0x00000036", + "vme_read 0x09 d16 0x00000038", + "vme_read 0x09 d16 0x0000003a" + ], + "name": "readout" + } + ], + "name": "mvhv-4.readout" + } + }, + { + "init": { + "groups": [ + { + "contents": [ + "vme_read 0x09 d16 0x00006008", + "vme_read 0x09 d16 0x0000600e" + ], + "name": "reset" + }, + { + "contents": [ + "vme_write 0x09 d16 0x00006010 0x00000008", + "vme_write 0x09 d16 0x00006012 0x00000009", + "vme_write 0x09 d16 0x0000601e 0x00000003", + "vme_write 0x09 d16 0x00006018 0x000000c8", + "vme_write 0x09 d16 0x0000601a 0x00000001", + "vme_write 0x09 d16 0x00006020 0x00000080", + "vme_write 0x09 d16 0x00006024 0x00000000" + ], + "name": "vme_interface_settings" + } + ], + "name": "mvlc_event_stamper.init" + }, + "name": "mvlc_event_stamper", + "readout": { + "groups": [ + { + "contents": [ + "vme_block_read 0x08 65535 0x00000000" + ], + "name": "readout" + } + ], + "name": "mvlc_event_stamper.readout" + } + }, + { + "init": { + "groups": [ + { + "contents": [ + "vme_read 0x09 d16 0x00006008", + "vme_read 0x09 d16 0x0000600e" + ], + "name": "reset" + }, + { + "contents": [ + "vme_write 0x09 d16 0x00000200 0x00000309", + "vme_write 0x09 d16 0x00000308 0x00000001", + "vme_write 0x09 d16 0x00000200 0x0000030a", + "vme_write 0x09 d16 0x00000308 0x00000001", + "vme_write 0x09 d16 0x00000200 0x0000030b", + "vme_write 0x09 d16 0x00000308 0x00000001", + "vme_write 0x09 d16 0x00000200 0x0000030c", + "vme_write 0x09 d16 0x00000308 0x00000001", + "vme_write 0x09 d16 0x00000200 0x0000030d", + "vme_write 0x09 d16 0x00000308 0x00000001", + "vme_write 0x09 d16 0x00000200 0x0000030e", + "vme_write 0x09 d16 0x00000308 0x00000001", + "vme_write 0x09 d16 0x00000200 0x0000030f", + "vme_write 0x09 d16 0x00000308 0x00000001" + ], + "name": "vme_interface_settings" + } + ], + "name": "mvlc_ts.init" + }, + "name": "mvlc_ts", + "readout": { + "groups": [ + { + "contents": [ + "vme_write 0x09 d16 0xffff0200 0x00000309", + "vme_read 0x09 d16 0xffff0300", + "vme_read 0x09 d16 0xffff0302", + "vme_read 0x09 d16 0xffff0304", + "vme_read 0x09 d16 0xffff0306" + ], + "name": "readout" + } + ], + "name": "mvlc_ts.readout" + } + }, + { + "init": { + "groups": [ + { + "contents": null, + "name": "reset" + }, + { + "contents": [ + "vme_write 0x09 d16 0x00006074 0x00000001", + "vme_write 0x09 d16 0x00006082 0x00000000", + "vme_write 0x09 d16 0x00006084 0x00000006", + "vme_write 0x09 d16 0x00006088 0x00000000", + "software_delay 1", + "vme_read 0x09 d16 0x0000608a", + "vme_read 0x09 d16 0x00006088", + "vme_write 0x09 d16 0x00006082 0x00000000", + "vme_write 0x09 d16 0x00006084 0x00000010", + "vme_write 0x09 d16 0x00006086 0x00000000", + "vme_write 0x09 d16 0x00006088 0x00000064", + "software_delay 1", + "vme_read 0x09 d16 0x0000608a", + "vme_read 0x09 d16 0x00006088", + "vme_write 0x09 d16 0x00006082 0x00000000", + "vme_write 0x09 d16 0x00006084 0x00000010", + "vme_write 0x09 d16 0x00006086 0x00000001", + "vme_write 0x09 d16 0x00006088 0x000000c8", + "software_delay 1", + "vme_read 0x09 d16 0x0000608a", + "vme_read 0x09 d16 0x00006088", + "vme_write 0x09 d16 0x00006082 0x00000000", + "vme_write 0x09 d16 0x00006084 0x00000010", + "vme_write 0x09 d16 0x00006086 0x00000002", + "vme_write 0x09 d16 0x00006088 0x0000012c", + "software_delay 1", + "vme_read 0x09 d16 0x0000608a", + "vme_read 0x09 d16 0x00006088", + "vme_write 0x09 d16 0x00006082 0x00000000", + "vme_write 0x09 d16 0x00006084 0x00000010", + "vme_write 0x09 d16 0x00006086 0x00000003", + "vme_write 0x09 d16 0x00006088 0x00000190", + "software_delay 1", + "vme_read 0x09 d16 0x0000608a", + "vme_read 0x09 d16 0x00006088", + "vme_write 0x09 d16 0x00006082 0x00000000", + "vme_write 0x09 d16 0x00006084 0x00000010", + "vme_write 0x09 d16 0x00006086 0x00000004", + "vme_write 0x09 d16 0x00006088 0x00000001", + "software_delay 1", + "vme_read 0x09 d16 0x0000608a", + "vme_read 0x09 d16 0x00006088", + "vme_write 0x09 d16 0x00006082 0x00000000", + "vme_write 0x09 d16 0x00006084 0x00000010", + "vme_write 0x09 d16 0x00006086 0x00000005", + "vme_write 0x09 d16 0x00006088 0x00000001", + "software_delay 1", + "vme_read 0x09 d16 0x0000608a", + "vme_read 0x09 d16 0x00006088", + "vme_write 0x09 d16 0x00006082 0x00000000", + "vme_write 0x09 d16 0x00006084 0x00000010", + "vme_write 0x09 d16 0x00006086 0x00000006", + "vme_write 0x09 d16 0x00006088 0x00000001", + "software_delay 1", + "vme_read 0x09 d16 0x0000608a", + "vme_read 0x09 d16 0x00006088", + "vme_write 0x09 d16 0x00006082 0x00000000", + "vme_write 0x09 d16 0x00006084 0x00000010", + "vme_write 0x09 d16 0x00006086 0x00000007", + "vme_write 0x09 d16 0x00006088 0x00000001", + "software_delay 1", + "vme_read 0x09 d16 0x0000608a", + "vme_read 0x09 d16 0x00006088" + ], + "name": "module_init" + } + ], + "name": "mhv_4.init" + }, + "name": "mhv_4", + "readout": { + "groups": [ + { + "contents": [ + "vme_write 0x09 d16 0x00006082 0x00000000", + "vme_write 0x09 d16 0x00006084 0x00000012", + "vme_write 0x09 d16 0x00006086 0x00000070", + "vme_write 0x09 d16 0x00006088 0x00000000", + "wait 53247", + "vme_read 0x09 d16 0x00006088", + "vme_write 0x09 d16 0x00006082 0x00000000", + "vme_write 0x09 d16 0x00006084 0x00000012", + "vme_write 0x09 d16 0x00006086 0x00000071", + "vme_write 0x09 d16 0x00006088 0x00000000", + "wait 53247", + "vme_read 0x09 d16 0x00006088", + "vme_write 0x09 d16 0x00006082 0x00000000", + "vme_write 0x09 d16 0x00006084 0x00000012", + "vme_write 0x09 d16 0x00006086 0x00000072", + "vme_write 0x09 d16 0x00006088 0x00000000", + "wait 53247", + "vme_read 0x09 d16 0x00006088", + "vme_write 0x09 d16 0x00006082 0x00000000", + "vme_write 0x09 d16 0x00006084 0x00000012", + "vme_write 0x09 d16 0x00006086 0x00000073", + "vme_write 0x09 d16 0x00006088 0x00000000", + "wait 53247", + "vme_read 0x09 d16 0x00006088", + "vme_write 0x09 d16 0x00006082 0x00000000", + "vme_write 0x09 d16 0x00006084 0x00000012", + "vme_write 0x09 d16 0x00006086 0x00000032", + "vme_write 0x09 d16 0x00006088 0x00000000", + "wait 53247", + "vme_read 0x09 d16 0x00006088", + "vme_write 0x09 d16 0x00006082 0x00000000", + "vme_write 0x09 d16 0x00006084 0x00000012", + "vme_write 0x09 d16 0x00006086 0x00000033", + "vme_write 0x09 d16 0x00006088 0x00000000", + "wait 53247", + "vme_read 0x09 d16 0x00006088", + "vme_write 0x09 d16 0x00006082 0x00000000", + "vme_write 0x09 d16 0x00006084 0x00000012", + "vme_write 0x09 d16 0x00006086 0x00000034", + "vme_write 0x09 d16 0x00006088 0x00000000", + "wait 53247", + "vme_read 0x09 d16 0x00006088", + "vme_write 0x09 d16 0x00006082 0x00000000", + "vme_write 0x09 d16 0x00006084 0x00000012", + "vme_write 0x09 d16 0x00006086 0x00000035", + "vme_write 0x09 d16 0x00006088 0x00000000", + "wait 53247", + "vme_read 0x09 d16 0x00006088", + "vme_write 0x09 d16 0x00006082 0x00000000", + "vme_write 0x09 d16 0x00006084 0x00000012", + "vme_write 0x09 d16 0x00006086 0x0000001a", + "vme_write 0x09 d16 0x00006088 0x00000000", + "wait 53247", + "vme_read 0x09 d16 0x00006088", + "vme_write 0x09 d16 0x00006082 0x00000000", + "vme_write 0x09 d16 0x00006084 0x00000012", + "vme_write 0x09 d16 0x00006086 0x0000001b", + "vme_write 0x09 d16 0x00006088 0x00000000", + "wait 53247", + "vme_read 0x09 d16 0x00006088", + "vme_write 0x09 d16 0x00006082 0x00000000", + "vme_write 0x09 d16 0x00006084 0x00000012", + "vme_write 0x09 d16 0x00006086 0x0000001c", + "vme_write 0x09 d16 0x00006088 0x00000000", + "wait 53247", + "vme_read 0x09 d16 0x00006088", + "vme_write 0x09 d16 0x00006082 0x00000000", + "vme_write 0x09 d16 0x00006084 0x00000012", + "vme_write 0x09 d16 0x00006086 0x0000001d", + "vme_write 0x09 d16 0x00006088 0x00000000", + "wait 53247", + "vme_read 0x09 d16 0x00006088" + ], + "name": "readout" + } + ], + "name": "mhv_4.readout" + } + }, + { + "init": { + "groups": [ + { + "contents": [ + "vme_write 0x09 d16 0x00006008 0x00000001", + "software_delay 500", + "vme_read 0x09 d16 0x00006008", + "vme_read 0x09 d16 0x0000600e", + "vme_write 0x09 d16 0x0000603a 0x00000000", + "vme_write 0x09 d16 0x0000603c 0x00000001", + "vme_write 0x09 d16 0x00006034 0x00000001" + ], + "name": "reset" + }, + { + "contents": [ + "vme_write 0x09 d16 0x00006046 0x00000001", + "vme_write 0x09 d16 0x00006042 0x00000003", + "vme_write 0x09 d16 0x00006050 0x00000fd8", + "vme_write 0x09 d16 0x00006054 0x00000108", + "vme_write 0x09 d16 0x00006058 0x00000000", + "vme_write 0x09 d16 0x0000605a 0x00000001", + "vme_write 0x09 d16 0x0000605c 0x00000000", + "vme_write 0x09 d16 0x0000605e 0x000000ff", + "vme_write 0x09 d16 0x00006060 0x00000000", + "vme_write 0x09 d16 0x00006062 0x00000000", + "vme_write 0x09 d16 0x00006064 0x00000000", + "vme_write 0x09 d16 0x00006066 0x00000000", + "vme_write 0x09 d16 0x00006068 0x00000001", + "vme_write 0x09 d16 0x0000606a 0x00000001", + "vme_write 0x09 d16 0x0000606c 0x00000001", + "vme_write 0x09 d16 0x0000606e 0x00000004", + "vme_write 0x09 d16 0x00006096 0x00000000", + "vme_write 0x09 d16 0x00006098 0x00000001" + ], + "name": "module_init" + }, + { + "contents": [ + "vme_write 0x09 d16 0x0000611a 0x00000032", + "vme_write 0x09 d16 0x00006100 0x00000010", + "vme_write 0x09 d16 0x00006110 0x0000000c", + "vme_write 0x09 d16 0x00006112 0x00000000", + "vme_write 0x09 d16 0x00006110 0x00000009", + "vme_write 0x09 d16 0x00006112 0x00000023", + "vme_write 0x09 d16 0x00006110 0x0000000a", + "vme_write 0x09 d16 0x00006112 0x00000023", + "vme_write 0x09 d16 0x00006110 0x0000000b", + "vme_write 0x09 d16 0x00006112 0x00000023", + "vme_write 0x09 d16 0x00006110 0x00000010", + "vme_write 0x09 d16 0x00006112 0x000000c8", + "vme_write 0x09 d16 0x00006070 0x00000000", + "vme_write 0x09 d16 0x00006072 0x0000007f" + ], + "name": "frontend_settings" + }, + { + "contents": [ + "vme_write 0x09 d16 0x0000631a 0x0000ffff", + "vme_write 0x09 d16 0x0000631c 0x0000ffff", + "vme_write 0x09 d16 0x00006010 0x00000000", + "vme_write 0x09 d16 0x0000601c 0x00000000", + "vme_write 0x09 d16 0x0000601e 0x00000003", + "vme_write 0x09 d16 0x00006038 0x00000001", + "vme_write 0x09 d16 0x00006036 0x0000000b", + "vme_write 0x09 d16 0x0000601a 0x00000001", + "vme_write 0x09 d16 0x0000603a 0x00000000", + "vme_write 0x09 d16 0x0000603c 0x00000001", + "vme_write 0x09 d16 0x00006034 0x00000001", + "vme_write 0x09 d16 0x00006020 0x00000080", + "vme_write 0x09 d16 0x00006024 0x00000000" + ], + "name": "vme_interface_settings" + } + ], + "name": "vmmr.init" + }, + "name": "vmmr", + "readout": { + "groups": [ + { + "contents": [ + "vme_block_read 0x08 65535 0x00000000" + ], + "name": "readout" + } + ], + "name": "vmmr.readout" + } + }, + { + "init": { + "groups": [ + { + "contents": [ + "vme_write 0x09 d16 0x00006100 0x00000000", + "vme_write 0x09 d16 0x00006114 0x00000030", + "vme_write 0x09 d16 0x00006114 0x00000031", + "software_delay 50", + "vme_write 0x09 d16 0x00006100 0x00000000", + "vme_read 0x09 d16 0x00006118", + "vme_read 0x09 d16 0x00006118" + ], + "name": "reset" + }, + { + "contents": null, + "name": "module_init" + } + ], + "name": "vmmr_monitor.init" + }, + "name": "vmmr_monitor", + "readout": { + "groups": [ + { + "contents": [ + "vme_write 0x09 d16 0x00006100 0x00000000", + "vme_read 0x09 d16 0x00006116", + "vme_read 0x09 d16 0x00006118", + "vme_read 0x09 d16 0x00006116", + "vme_read 0x09 d16 0x00006118", + "vme_read 0x09 d16 0x00006116", + "vme_read 0x09 d16 0x00006118", + "vme_read 0x09 d16 0x00006116", + "vme_read 0x09 d16 0x00006118", + "vme_read 0x09 d16 0x00006116", + "vme_read 0x09 d16 0x00006118", + "vme_write 0x09 d16 0x00006100 0x00000000", + "vme_write 0x09 d16 0x00006114 0x00000005", + "vme_write 0x09 d16 0x00006114 0x00000006", + "vme_write 0x09 d16 0x00006114 0x00000007", + "vme_write 0x09 d16 0x00006114 0x00000023", + "vme_write 0x09 d16 0x00006114 0x00000024" + ], + "name": "readout" + } + ], + "name": "vmmr_monitor.readout" + } + } + ], + "mvme_version": "1.15.1.19" +} + diff --git a/assets/vme_module_data_sources.json b/assets/vme_module_data_sources.json new file mode 100644 index 0000000..3cfcd32 --- /dev/null +++ b/assets/vme_module_data_sources.json @@ -0,0 +1,412 @@ +{ + "modules": [ + { + "data_sources": [ + { + "filter": "00XXX1XX000AAAAA0O0DDDDDDDDDDDDD", + "name": "amplitude" + }, + { + "filter": "11DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", + "name": "module_timestamp" + } + ], + "display_name": "MADC-32", + "header_filter": "0100XXXXMMMMMMMMXXXXSSSSSSSSSSSS", + "type_name": "madc32", + "vendor_name": "mesytec", + "vme_address": "0x00000000" + }, + { + "data_sources": [ + { + "filter": "11DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", + "name": "module_timestamp" + }, + { + "filter": "000001XXAAAAAAAA0O00DDDDDDDDDDDD", + "name": "bus0_amplitudes" + }, + { + "filter": "000001XXAAAAAAAA1O00DDDDDDDDDDDD", + "name": "bus1_amplitudes" + } + ], + "display_name": "MDI-2", + "header_filter": "0100XXXXMMMMMMMMXXXXSSSSSSSSSSSS", + "type_name": "mdi2", + "vendor_name": "mesytec", + "vme_address": "0x00000000" + }, + { + "data_sources": [ + { + "filter": "0001XXXXXX010AAADDDDDDDDDDDDDDDD", + "name": "channel_time" + }, + { + "filter": "0001XXXXXX000AAADDDDDDDDDDDDDDDD", + "name": "integration_long" + }, + { + "filter": "0001XXXXXX110AAADDDDDDDDDDDDDDDD", + "name": "integration_short" + }, + { + "filter": "11DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", + "name": "module_timestamp" + } + ], + "display_name": "MDLL", + "header_filter": "0100 XXXX MMMM MMMM XXXX XXSS SSSS SSSS", + "type_name": "mdll", + "vendor_name": "mesytec", + "vme_address": "0x00000000" + }, + { + "data_sources": [ + { + "filter": "0001XXXXPO00AAAADDDDDDDDDDDDDDDD", + "name": "integration_long" + }, + { + "filter": "0001XXXXXX01AAAADDDDDDDDDDDDDDDD", + "name": "channel_time" + }, + { + "filter": "11DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", + "name": "module_timestamp" + }, + { + "filter": "0001XXXXXX10000ADDDDDDDDDDDDDDDD", + "name": "trigger_time" + }, + { + "filter": "0001XXXXXX11AAAADDDDDDDDDDDDDDDD", + "name": "integration_short" + } + ], + "display_name": "MDPP-16_CSI", + "header_filter": "0100XXXXMMMMMMMMXXXXXXSSSSSSSSSS", + "type_name": "mdpp16_csi", + "vendor_name": "mesytec", + "vme_address": "0x00000000" + }, + { + "data_sources": [ + { + "filter": "0001XXXXPO00AAAADDDDDDDDDDDDDDDD", + "name": "amplitude" + }, + { + "filter": "0001XXXXXX01AAAADDDDDDDDDDDDDDDD", + "name": "channel_time" + }, + { + "filter": "11DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", + "name": "module_timestamp" + }, + { + "filter": "0001XXXXXX10000ADDDDDDDDDDDDDDDD", + "name": "trigger_time" + } + ], + "display_name": "MDPP-16_PADC", + "header_filter": "0100XXXXMMMMMMMMXXXXXXSSSSSSSSSS", + "type_name": "mdpp16_padc", + "vendor_name": "mesytec", + "vme_address": "0x00000000" + }, + { + "data_sources": [ + { + "filter": "0001XXXXXX01AAAADDDDDDDDDDDDDDDD", + "name": "channel_time" + }, + { + "filter": "0001XXXXXX00AAAADDDDDDDDDDDDDDDD", + "name": "integration_long" + }, + { + "filter": "0001XXXXXX11AAAADDDDDDDDDDDDDDDD", + "name": "integration_short" + }, + { + "filter": "0001XXXXXX10000ADDDDDDDDDDDDDDDD", + "name": "trigger_time" + }, + { + "filter": "11DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", + "name": "module_timestamp" + } + ], + "display_name": "MDPP-16_QDC", + "header_filter": "0100XXXXMMMMMMMMXXXXXXSSSSSSSSSS", + "type_name": "mdpp16_qdc", + "vendor_name": "mesytec", + "vme_address": "0x00000000" + }, + { + "data_sources": [ + { + "filter": "0001XXXXPO00AAAADDDDDDDDDDDDDDDD", + "name": "amplitude" + }, + { + "filter": "0001XXXXXX01AAAADDDDDDDDDDDDDDDD", + "name": "channel_time" + }, + { + "filter": "0001XXXXXX10000ADDDDDDDDDDDDDDDD", + "name": "trigger_time" + }, + { + "filter": "11DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", + "name": "module_timestamp" + } + ], + "display_name": "MDPP-16_RCP", + "header_filter": "0100XXXXMMMMMMMMXXXXXXSSSSSSSSSS", + "type_name": "mdpp16_rcp", + "vendor_name": "mesytec", + "vme_address": "0x00000000" + }, + { + "data_sources": [ + { + "filter": "0001XXXXPO00AAAADDDDDDDDDDDDDDDD", + "name": "amplitude" + }, + { + "filter": "0001XXXXXX01AAAADDDDDDDDDDDDDDDD", + "name": "channel_time" + }, + { + "filter": "0001XXXXXX10000ADDDDDDDDDDDDDDDD", + "name": "trigger_time" + }, + { + "filter": "11DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", + "name": "module_timestamp" + } + ], + "display_name": "MDPP-16_SCP", + "header_filter": "0100XXXXMMMMMMMMXXXXXXSSSSSSSSSS", + "type_name": "mdpp16_scp", + "vendor_name": "mesytec", + "vme_address": "0x00000000" + }, + { + "data_sources": [ + { + "filter": "0001XXXPO00AAAAADDDDDDDDDDDDDDDD", + "name": "amplitude" + }, + { + "filter": "0001XXXPO01AAAAADDDDDDDDDDDDDDDD", + "name": "channel_time" + }, + { + "filter": "11DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", + "name": "module_timestamp" + }, + { + "filter": "0001XXXXX100000ADDDDDDDDDDDDDDDD", + "name": "trigger_time" + } + ], + "display_name": "MDPP-32_PADC", + "header_filter": "0100 XXXX MMMM MMMM XXXX XXSS SSSS SSSS", + "type_name": "mdpp32_padc", + "vendor_name": "mesytec", + "vme_address": "0x00000000" + }, + { + "data_sources": [ + { + "filter": "0001XXXXX01AAAAADDDDDDDDDDDDDDDD", + "name": "channel_time" + }, + { + "filter": "0001XXXXX00AAAAADDDDDDDDDDDDDDDD", + "name": "integration_long" + }, + { + "filter": "0001XXXXX11AAAAADDDDDDDDDDDDDDDD", + "name": "integration_short" + }, + { + "filter": "11DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", + "name": "module_timestamp" + }, + { + "filter": "0001XXXXX100000ADDDDDDDDDDDDDDDD", + "name": "trigger_time" + } + ], + "display_name": "MDPP-32_QDC", + "header_filter": "0100 XXXX MMMM MMMM XXXX XXSS SSSS SSSS", + "type_name": "mdpp32_qdc", + "vendor_name": "mesytec", + "vme_address": "0x00000000" + }, + { + "data_sources": [ + { + "filter": "0001XXXPO00AAAAADDDDDDDDDDDDDDDD", + "name": "amplitude" + }, + { + "filter": "0001XXXPO01AAAAADDDDDDDDDDDDDDDD", + "name": "channel_time" + }, + { + "filter": "0001XXXXX100000ADDDDDDDDDDDDDDDD", + "name": "trigger_time" + }, + { + "filter": "11DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", + "name": "module_timestamp" + } + ], + "display_name": "MDPP-32_SCP", + "header_filter": "0100 XXXX MMMM MMMM XXXX XXSS SSSS SSSS", + "type_name": "mdpp32_scp", + "vendor_name": "mesytec", + "vme_address": "0x00000000" + }, + { + "data_sources": [ + { + "filter": "00XXX1XX000AAAAAO000DDDDDDDDDDDD", + "name": "amplitude" + }, + { + "filter": "11DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", + "name": "module_timestamp" + } + ], + "display_name": "MQDC-32", + "header_filter": "0100XXXXMMMMMMMMXXXXSSSSSSSSSSSS", + "type_name": "mqdc32", + "vendor_name": "mesytec", + "vme_address": "0x00000000" + }, + { + "data_sources": [ + { + "filter": "00XXX1XX000AAAAADDDDDDDDDDDDDDDD", + "name": "channel_time" + }, + { + "filter": "00XXX1XX0010000ADDDDDDDDDDDDDDDD", + "name": "trigger_time" + }, + { + "filter": "11DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", + "name": "module_timestamp" + } + ], + "display_name": "MTDC-32", + "header_filter": "0100XXXXMMMMMMMMXXXXSSSSSSSSSSSS", + "type_name": "mtdc32", + "vendor_name": "mesytec", + "vme_address": "0x00000000" + }, + { + "data_sources": [ + { + "filter": "11DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", + "name": "module_timestamp" + } + ], + "display_name": "MVLC Event Stamper", + "header_filter": "0100XXXXMMMMMMMMXXXXXXSSSSSSSSSS", + "type_name": "mvlc_event_stamper", + "vendor_name": "mesytec", + "vme_address": "0xffff0000" + }, + { + "data_sources": [ + { + "filter": "0010AAAA00000000DDDDDDDDDDDDDDDD", + "name": "bus_time" + }, + { + "filter": "00010000XXXXXAAAAAAADDDDDDDDDDDD", + "name": "amplitude_bus0" + }, + { + "filter": "11DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", + "name": "module_timestamp" + }, + { + "filter": "0001XXXXXX10000ADDDDDDDDDDDDDDDD", + "name": "trigger_time" + } + ], + "display_name": "VMMR-8/16", + "header_filter": "0100 XXXX MMMM MMMM XXXX SSSS SSSS SSSS", + "type_name": "vmmr", + "vendor_name": "mesytec", + "vme_address": "0x00000000" + }, + { + "data_sources": [ + { + "filter": "000000AAAAAAADDDDDDDDDDDDDDDDDDD", + "name": "tdc_channels" + }, + { + "filter": "10001DDDDDDDDDDDDDDDDDDDDDDDDDDD", + "name": "ext_trig_time_tag" + }, + { + "filter": "01000DDDDDDDDDDDDDDDDDDDDDDXXXXX", + "name": "event_counter" + } + ], + "display_name": "CAEN V1190A", + "header_filter": "1000 0LOE XXXS SSSS SSSS SSSS SSSG GGGG", + "type_name": "caen_v1190a", + "vendor_name": "CAEN", + "vme_address": "0x00000000" + }, + { + "data_sources": [ + { + "filter": "XXXXX000XXXAAAAAXXUODDDDDDDDDDDD", + "name": "amplitude" + }, + { + "filter": "XXXXX100DDDDDDDDDDDDDDDDDDDDDDDD", + "name": "event_counter" + } + ], + "display_name": "CAEN V775", + "header_filter": "XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX", + "type_name": "caen_v775", + "vendor_name": "CAEN", + "vme_address": "0x00000000" + }, + { + "data_sources": [ + { + "filter": "XXXXX000XXXAAAAAXXUODDDDDDDDDDDD", + "name": "amplitude" + }, + { + "filter": "XXXXX100DDDDDDDDDDDDDDDDDDDDDDDD", + "name": "event_counter" + } + ], + "display_name": "CAEN V785", + "header_filter": "XXXX X010 XXXX XXXX 00XX XXXX XXXX XXXX", + "type_name": "caen_v785", + "vendor_name": "CAEN", + "vme_address": "0x00000000" + } + ], + "mvme_version": "1.15.1.19" +} + From e86303f7eb2623a6907c15bdf0a9f194a23bd056 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20L=C3=BCke?= Date: Sat, 21 Dec 2024 01:30:00 +0100 Subject: [PATCH 04/19] cmake: cleanup --- src/CMakeLists.txt | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 38d7076..e756158 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,22 +1,11 @@ set(MVLC_NNG_MNODE_WARN_FLAGS -Wall -Wextra -Wpedantic) -#find_program(CLANG_TIDY_EXECUTABLE clang-tidy) -#if (CLANG_TIDY_EXECUTABLE) -# set(CMAKE_C_CLANG_TIDY clang-tidy -p ${CMAKE_BINARY_DIR} --extra-arg=-std=c11) -# set(CMAKE_CXX_CLANG_TIDY clang-tidy -p ${CMAKE_BINARY_DIR} --extra-arg=-std=c++17) -#endif() - add_library(mesytec-mnode mnode_nng.cc mnode_nng_async.cc mnode_nng_proto.cc) target_include_directories(mesytec-mnode PUBLIC $ PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/mesytec-mnode) target_link_libraries(mesytec-mnode PUBLIC nng mnode-proto PRIVATE spdlog) target_compile_features(mesytec-mnode PRIVATE cxx_std_17) +target_compile_options(mesytec-mnode PRIVATE ${MVLC_NNG_MNODE_WARN_FLAGS}) add_subdirectory(tools) - - -#add_subdirectory(qt) - -#unset(CMAKE_C_CLANG_TIDY) -#unset(CMAKE_CXX_CLANG_TIDY) From c79a4b8fa9c548193f40815b37b127f12757ffbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20L=C3=BCke?= Date: Sat, 21 Dec 2024 15:15:37 +0100 Subject: [PATCH 05/19] rename assets/ to data/ --- {assets => data}/vme_base_configs.json | 0 {assets => data}/vme_module_data_sources.json | 3 ++- 2 files changed, 2 insertions(+), 1 deletion(-) rename {assets => data}/vme_base_configs.json (100%) rename {assets => data}/vme_module_data_sources.json (99%) diff --git a/assets/vme_base_configs.json b/data/vme_base_configs.json similarity index 100% rename from assets/vme_base_configs.json rename to data/vme_base_configs.json diff --git a/assets/vme_module_data_sources.json b/data/vme_module_data_sources.json similarity index 99% rename from assets/vme_module_data_sources.json rename to data/vme_module_data_sources.json index 3cfcd32..56d888e 100644 --- a/assets/vme_module_data_sources.json +++ b/data/vme_module_data_sources.json @@ -407,6 +407,7 @@ "vme_address": "0x00000000" } ], - "mvme_version": "1.15.1.19" + "mvme_commit": "1c9e1f1b99defea1c849269386ad41f73f6aa1cc", + "mvme_version": "1.15.1.22" } From f06561b7dd923b9f2a45552d477a2dfb59ea6d2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20L=C3=BCke?= Date: Sat, 21 Dec 2024 15:16:24 +0100 Subject: [PATCH 06/19] cmake: add cmrc by vector-of-bool --- cmake/CMakeRC.cmake | 645 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 645 insertions(+) create mode 100644 cmake/CMakeRC.cmake diff --git a/cmake/CMakeRC.cmake b/cmake/CMakeRC.cmake new file mode 100644 index 0000000..2facace --- /dev/null +++ b/cmake/CMakeRC.cmake @@ -0,0 +1,645 @@ +# Source: https://github.com/vector-of-bool/cmrc +# This block is executed when generating an intermediate resource file, not when +# running in CMake configure mode +if(_CMRC_GENERATE_MODE) + # Read in the digits + file(READ "${INPUT_FILE}" bytes HEX) + # Format each pair into a character literal. Heuristics seem to favor doing + # the conversion in groups of five for fastest conversion + string(REGEX REPLACE "(..)(..)(..)(..)(..)" "'\\\\x\\1','\\\\x\\2','\\\\x\\3','\\\\x\\4','\\\\x\\5'," chars "${bytes}") + # Since we did this in groups, we have some leftovers to clean up + string(LENGTH "${bytes}" n_bytes2) + math(EXPR n_bytes "${n_bytes2} / 2") + math(EXPR remainder "${n_bytes} % 5") # <-- '5' is the grouping count from above + set(cleanup_re "$") + set(cleanup_sub ) + while(remainder) + set(cleanup_re "(..)${cleanup_re}") + set(cleanup_sub "'\\\\x\\${remainder}',${cleanup_sub}") + math(EXPR remainder "${remainder} - 1") + endwhile() + if(NOT cleanup_re STREQUAL "$") + string(REGEX REPLACE "${cleanup_re}" "${cleanup_sub}" chars "${chars}") + endif() + string(CONFIGURE [[ + namespace { const char file_array[] = { @chars@ 0 }; } + namespace cmrc { namespace @NAMESPACE@ { namespace res_chars { + extern const char* const @SYMBOL@_begin = file_array; + extern const char* const @SYMBOL@_end = file_array + @n_bytes@; + }}} + ]] code) + file(WRITE "${OUTPUT_FILE}" "${code}") + # Exit from the script. Nothing else needs to be processed + return() +endif() + +set(_version 2.0.0) + +cmake_minimum_required(VERSION 3.12) +include(CMakeParseArguments) + +if(COMMAND cmrc_add_resource_library) + if(NOT DEFINED _CMRC_VERSION OR NOT (_version STREQUAL _CMRC_VERSION)) + message(WARNING "More than one CMakeRC version has been included in this project.") + endif() + # CMakeRC has already been included! Don't do anything + return() +endif() + +set(_CMRC_VERSION "${_version}" CACHE INTERNAL "CMakeRC version. Used for checking for conflicts") + +set(_CMRC_SCRIPT "${CMAKE_CURRENT_LIST_FILE}" CACHE INTERNAL "Path to CMakeRC script") + +function(_cmrc_normalize_path var) + set(path "${${var}}") + file(TO_CMAKE_PATH "${path}" path) + while(path MATCHES "//") + string(REPLACE "//" "/" path "${path}") + endwhile() + string(REGEX REPLACE "/+$" "" path "${path}") + set("${var}" "${path}" PARENT_SCOPE) +endfunction() + +get_filename_component(_inc_dir "${CMAKE_BINARY_DIR}/_cmrc/include" ABSOLUTE) +set(CMRC_INCLUDE_DIR "${_inc_dir}" CACHE INTERNAL "Directory for CMakeRC include files") +# Let's generate the primary include file +file(MAKE_DIRECTORY "${CMRC_INCLUDE_DIR}/cmrc") +set(hpp_content [==[ +#ifndef CMRC_CMRC_HPP_INCLUDED +#define CMRC_CMRC_HPP_INCLUDED + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if !(defined(__EXCEPTIONS) || defined(__cpp_exceptions) || defined(_CPPUNWIND) || defined(CMRC_NO_EXCEPTIONS)) +#define CMRC_NO_EXCEPTIONS 1 +#endif + +namespace cmrc { namespace detail { struct dummy; } } + +#define CMRC_DECLARE(libid) \ + namespace cmrc { namespace detail { \ + struct dummy; \ + static_assert(std::is_same::value, "CMRC_DECLARE() must only appear at the global namespace"); \ + } } \ + namespace cmrc { namespace libid { \ + cmrc::embedded_filesystem get_filesystem(); \ + } } static_assert(true, "") + +namespace cmrc { + +class file { + const char* _begin = nullptr; + const char* _end = nullptr; + +public: + using iterator = const char*; + using const_iterator = iterator; + iterator begin() const noexcept { return _begin; } + iterator cbegin() const noexcept { return _begin; } + iterator end() const noexcept { return _end; } + iterator cend() const noexcept { return _end; } + std::size_t size() const { return static_cast(std::distance(begin(), end())); } + + file() = default; + file(iterator beg, iterator end) noexcept : _begin(beg), _end(end) {} +}; + +class directory_entry; + +namespace detail { + +class directory; +class file_data; + +class file_or_directory { + union _data_t { + class file_data* file_data; + class directory* directory; + } _data; + bool _is_file = true; + +public: + explicit file_or_directory(file_data& f) { + _data.file_data = &f; + } + explicit file_or_directory(directory& d) { + _data.directory = &d; + _is_file = false; + } + bool is_file() const noexcept { + return _is_file; + } + bool is_directory() const noexcept { + return !is_file(); + } + const directory& as_directory() const noexcept { + assert(!is_file()); + return *_data.directory; + } + const file_data& as_file() const noexcept { + assert(is_file()); + return *_data.file_data; + } +}; + +class file_data { +public: + const char* begin_ptr; + const char* end_ptr; + file_data(const file_data&) = delete; + file_data(const char* b, const char* e) : begin_ptr(b), end_ptr(e) {} +}; + +inline std::pair split_path(const std::string& path) { + auto first_sep = path.find("/"); + if (first_sep == path.npos) { + return std::make_pair(path, ""); + } else { + return std::make_pair(path.substr(0, first_sep), path.substr(first_sep + 1)); + } +} + +struct created_subdirectory { + class directory& directory; + class file_or_directory& index_entry; +}; + +class directory { + std::list _files; + std::list _dirs; + std::map _index; + + using base_iterator = std::map::const_iterator; + +public: + + directory() = default; + directory(const directory&) = delete; + + created_subdirectory add_subdir(std::string name) & { + _dirs.emplace_back(); + auto& back = _dirs.back(); + auto& fod = _index.emplace(name, file_or_directory{back}).first->second; + return created_subdirectory{back, fod}; + } + + file_or_directory* add_file(std::string name, const char* begin, const char* end) & { + assert(_index.find(name) == _index.end()); + _files.emplace_back(begin, end); + return &_index.emplace(name, file_or_directory{_files.back()}).first->second; + } + + const file_or_directory* get(const std::string& path) const { + auto pair = split_path(path); + auto child = _index.find(pair.first); + if (child == _index.end()) { + return nullptr; + } + auto& entry = child->second; + if (pair.second.empty()) { + // We're at the end of the path + return &entry; + } + + if (entry.is_file()) { + // We can't traverse into a file. Stop. + return nullptr; + } + // Keep going down + return entry.as_directory().get(pair.second); + } + + class iterator { + base_iterator _base_iter; + base_iterator _end_iter; + public: + using value_type = directory_entry; + using difference_type = std::ptrdiff_t; + using pointer = const value_type*; + using reference = const value_type&; + using iterator_category = std::input_iterator_tag; + + iterator() = default; + explicit iterator(base_iterator iter, base_iterator end) : _base_iter(iter), _end_iter(end) {} + + iterator begin() const noexcept { + return *this; + } + + iterator end() const noexcept { + return iterator(_end_iter, _end_iter); + } + + inline value_type operator*() const noexcept; + + bool operator==(const iterator& rhs) const noexcept { + return _base_iter == rhs._base_iter; + } + + bool operator!=(const iterator& rhs) const noexcept { + return !(*this == rhs); + } + + iterator& operator++() noexcept { + ++_base_iter; + return *this; + } + + iterator operator++(int) noexcept { + auto cp = *this; + ++_base_iter; + return cp; + } + }; + + using const_iterator = iterator; + + iterator begin() const noexcept { + return iterator(_index.begin(), _index.end()); + } + + iterator end() const noexcept { + return iterator(); + } +}; + +inline std::string normalize_path(std::string path) { + while (path.find("/") == 0) { + path.erase(path.begin()); + } + while (!path.empty() && (path.rfind("/") == path.size() - 1)) { + path.pop_back(); + } + auto off = path.npos; + while ((off = path.find("//")) != path.npos) { + path.erase(path.begin() + static_cast(off)); + } + return path; +} + +using index_type = std::map; + +} // detail + +class directory_entry { + std::string _fname; + const detail::file_or_directory* _item; + +public: + directory_entry() = delete; + explicit directory_entry(std::string filename, const detail::file_or_directory& item) + : _fname(filename) + , _item(&item) + {} + + const std::string& filename() const & { + return _fname; + } + std::string filename() const && { + return std::move(_fname); + } + + bool is_file() const { + return _item->is_file(); + } + + bool is_directory() const { + return _item->is_directory(); + } +}; + +directory_entry detail::directory::iterator::operator*() const noexcept { + assert(begin() != end()); + return directory_entry(_base_iter->first, _base_iter->second); +} + +using directory_iterator = detail::directory::iterator; + +class embedded_filesystem { + // Never-null: + const cmrc::detail::index_type* _index; + const detail::file_or_directory* _get(std::string path) const { + path = detail::normalize_path(path); + auto found = _index->find(path); + if (found == _index->end()) { + return nullptr; + } else { + return found->second; + } + } + +public: + explicit embedded_filesystem(const detail::index_type& index) + : _index(&index) + {} + + file open(const std::string& path) const { + auto entry_ptr = _get(path); + if (!entry_ptr || !entry_ptr->is_file()) { +#ifdef CMRC_NO_EXCEPTIONS + fprintf(stderr, "Error no such file or directory: %s\n", path.c_str()); + abort(); +#else + throw std::system_error(make_error_code(std::errc::no_such_file_or_directory), path); +#endif + } + auto& dat = entry_ptr->as_file(); + return file{dat.begin_ptr, dat.end_ptr}; + } + + bool is_file(const std::string& path) const noexcept { + auto entry_ptr = _get(path); + return entry_ptr && entry_ptr->is_file(); + } + + bool is_directory(const std::string& path) const noexcept { + auto entry_ptr = _get(path); + return entry_ptr && entry_ptr->is_directory(); + } + + bool exists(const std::string& path) const noexcept { + return !!_get(path); + } + + directory_iterator iterate_directory(const std::string& path) const { + auto entry_ptr = _get(path); + if (!entry_ptr) { +#ifdef CMRC_NO_EXCEPTIONS + fprintf(stderr, "Error no such file or directory: %s\n", path.c_str()); + abort(); +#else + throw std::system_error(make_error_code(std::errc::no_such_file_or_directory), path); +#endif + } + if (!entry_ptr->is_directory()) { +#ifdef CMRC_NO_EXCEPTIONS + fprintf(stderr, "Error not a directory: %s\n", path.c_str()); + abort(); +#else + throw std::system_error(make_error_code(std::errc::not_a_directory), path); +#endif + } + return entry_ptr->as_directory().begin(); + } +}; + +} + +#endif // CMRC_CMRC_HPP_INCLUDED +]==]) + +set(cmrc_hpp "${CMRC_INCLUDE_DIR}/cmrc/cmrc.hpp" CACHE INTERNAL "") +set(_generate 1) +if(EXISTS "${cmrc_hpp}") + file(READ "${cmrc_hpp}" _current) + if(_current STREQUAL hpp_content) + set(_generate 0) + endif() +endif() +file(GENERATE OUTPUT "${cmrc_hpp}" CONTENT "${hpp_content}" CONDITION ${_generate}) + +add_library(cmrc-base INTERFACE) +target_include_directories(cmrc-base INTERFACE $) +# Signal a basic C++11 feature to require C++11. +target_compile_features(cmrc-base INTERFACE cxx_nullptr) +set_property(TARGET cmrc-base PROPERTY INTERFACE_CXX_EXTENSIONS OFF) +add_library(cmrc::base ALIAS cmrc-base) + +function(cmrc_add_resource_library name) + set(args ALIAS NAMESPACE TYPE) + cmake_parse_arguments(ARG "" "${args}" "" "${ARGN}") + # Generate the identifier for the resource library's namespace + set(ns_re "[a-zA-Z_][a-zA-Z0-9_]*") + if(NOT DEFINED ARG_NAMESPACE) + # Check that the library name is also a valid namespace + if(NOT name MATCHES "${ns_re}") + message(SEND_ERROR "Library name is not a valid namespace. Specify the NAMESPACE argument") + endif() + set(ARG_NAMESPACE "${name}") + else() + if(NOT ARG_NAMESPACE MATCHES "${ns_re}") + message(SEND_ERROR "NAMESPACE for ${name} is not a valid C++ namespace identifier (${ARG_NAMESPACE})") + endif() + endif() + set(libname "${name}") + # Check that type is either "STATIC" or "OBJECT", or default to "STATIC" if + # not set + if(NOT DEFINED ARG_TYPE) + set(ARG_TYPE STATIC) + elseif(NOT "${ARG_TYPE}" MATCHES "^(STATIC|OBJECT)$") + message(SEND_ERROR "${ARG_TYPE} is not a valid TYPE (STATIC and OBJECT are acceptable)") + set(ARG_TYPE STATIC) + endif() + # Generate a library with the compiled in character arrays. + string(CONFIGURE [=[ + #include + #include + #include + + namespace cmrc { + namespace @ARG_NAMESPACE@ { + + namespace res_chars { + // These are the files which are available in this resource library + $, + > + } + + namespace { + + const cmrc::detail::index_type& + get_root_index() { + static cmrc::detail::directory root_directory_; + static cmrc::detail::file_or_directory root_directory_fod{root_directory_}; + static cmrc::detail::index_type root_index; + root_index.emplace("", &root_directory_fod); + struct dir_inl { + class cmrc::detail::directory& directory; + }; + dir_inl root_directory_dir{root_directory_}; + (void)root_directory_dir; + $, + > + $, + > + return root_index; + } + + } + + cmrc::embedded_filesystem get_filesystem() { + static auto& index = get_root_index(); + return cmrc::embedded_filesystem{index}; + } + + } // @ARG_NAMESPACE@ + } // cmrc + ]=] cpp_content @ONLY) + get_filename_component(libdir "${CMAKE_CURRENT_BINARY_DIR}/__cmrc_${name}" ABSOLUTE) + get_filename_component(lib_tmp_cpp "${libdir}/lib_.cpp" ABSOLUTE) + string(REPLACE "\n " "\n" cpp_content "${cpp_content}") + file(GENERATE OUTPUT "${lib_tmp_cpp}" CONTENT "${cpp_content}") + get_filename_component(libcpp "${libdir}/lib.cpp" ABSOLUTE) + add_custom_command(OUTPUT "${libcpp}" + DEPENDS "${lib_tmp_cpp}" "${cmrc_hpp}" + COMMAND ${CMAKE_COMMAND} -E copy_if_different "${lib_tmp_cpp}" "${libcpp}" + COMMENT "Generating ${name} resource loader" + ) + # Generate the actual static library. Each source file is just a single file + # with a character array compiled in containing the contents of the + # corresponding resource file. + add_library(${name} ${ARG_TYPE} ${libcpp}) + set_property(TARGET ${name} PROPERTY CMRC_LIBDIR "${libdir}") + set_property(TARGET ${name} PROPERTY CMRC_NAMESPACE "${ARG_NAMESPACE}") + target_link_libraries(${name} PUBLIC cmrc::base) + set_property(TARGET ${name} PROPERTY CMRC_IS_RESOURCE_LIBRARY TRUE) + if(ARG_ALIAS) + add_library("${ARG_ALIAS}" ALIAS ${name}) + endif() + cmrc_add_resources(${name} ${ARG_UNPARSED_ARGUMENTS}) +endfunction() + +function(_cmrc_register_dirs name dirpath) + if(dirpath STREQUAL "") + return() + endif() + # Skip this dir if we have already registered it + get_target_property(registered "${name}" _CMRC_REGISTERED_DIRS) + if(dirpath IN_LIST registered) + return() + endif() + # Register the parent directory first + get_filename_component(parent "${dirpath}" DIRECTORY) + if(NOT parent STREQUAL "") + _cmrc_register_dirs("${name}" "${parent}") + endif() + # Now generate the registration + set_property(TARGET "${name}" APPEND PROPERTY _CMRC_REGISTERED_DIRS "${dirpath}") + _cm_encode_fpath(sym "${dirpath}") + if(parent STREQUAL "") + set(parent_sym root_directory) + else() + _cm_encode_fpath(parent_sym "${parent}") + endif() + get_filename_component(leaf "${dirpath}" NAME) + set_property( + TARGET "${name}" + APPEND PROPERTY CMRC_MAKE_DIRS + "static auto ${sym}_dir = ${parent_sym}_dir.directory.add_subdir(\"${leaf}\")\;" + "root_index.emplace(\"${dirpath}\", &${sym}_dir.index_entry)\;" + ) +endfunction() + +function(cmrc_add_resources name) + get_target_property(is_reslib ${name} CMRC_IS_RESOURCE_LIBRARY) + if(NOT TARGET ${name} OR NOT is_reslib) + message(SEND_ERROR "cmrc_add_resources called on target '${name}' which is not an existing resource library") + return() + endif() + + set(options) + set(args WHENCE PREFIX) + set(list_args) + cmake_parse_arguments(ARG "${options}" "${args}" "${list_args}" "${ARGN}") + + if(NOT ARG_WHENCE) + set(ARG_WHENCE ${CMAKE_CURRENT_SOURCE_DIR}) + endif() + _cmrc_normalize_path(ARG_WHENCE) + get_filename_component(ARG_WHENCE "${ARG_WHENCE}" ABSOLUTE) + + # Generate the identifier for the resource library's namespace + get_target_property(lib_ns "${name}" CMRC_NAMESPACE) + + get_target_property(libdir ${name} CMRC_LIBDIR) + get_target_property(target_dir ${name} SOURCE_DIR) + file(RELATIVE_PATH reldir "${target_dir}" "${CMAKE_CURRENT_SOURCE_DIR}") + if(reldir MATCHES "^\\.\\.") + message(SEND_ERROR "Cannot call cmrc_add_resources in a parent directory from the resource library target") + return() + endif() + + foreach(input IN LISTS ARG_UNPARSED_ARGUMENTS) + _cmrc_normalize_path(input) + get_filename_component(abs_in "${input}" ABSOLUTE) + # Generate a filename based on the input filename that we can put in + # the intermediate directory. + file(RELATIVE_PATH relpath "${ARG_WHENCE}" "${abs_in}") + if(relpath MATCHES "^\\.\\.") + # For now we just error on files that exist outside of the soure dir. + message(SEND_ERROR "Cannot add file '${input}': File must be in a subdirectory of ${ARG_WHENCE}") + continue() + endif() + if(DEFINED ARG_PREFIX) + _cmrc_normalize_path(ARG_PREFIX) + endif() + if(ARG_PREFIX AND NOT ARG_PREFIX MATCHES "/$") + set(ARG_PREFIX "${ARG_PREFIX}/") + endif() + get_filename_component(dirpath "${ARG_PREFIX}${relpath}" DIRECTORY) + _cmrc_register_dirs("${name}" "${dirpath}") + get_filename_component(abs_out "${libdir}/intermediate/${ARG_PREFIX}${relpath}.cpp" ABSOLUTE) + # Generate a symbol name relpath the file's character array + _cm_encode_fpath(sym "${relpath}") + # Get the symbol name for the parent directory + if(dirpath STREQUAL "") + set(parent_sym root_directory) + else() + _cm_encode_fpath(parent_sym "${dirpath}") + endif() + # Generate the rule for the intermediate source file + _cmrc_generate_intermediate_cpp(${lib_ns} ${sym} "${abs_out}" "${abs_in}") + target_sources(${name} PRIVATE "${abs_out}") + set_property(TARGET ${name} APPEND PROPERTY CMRC_EXTERN_DECLS + "// Pointers to ${input}" + "extern const char* const ${sym}_begin\;" + "extern const char* const ${sym}_end\;" + ) + get_filename_component(leaf "${relpath}" NAME) + set_property( + TARGET ${name} + APPEND PROPERTY CMRC_MAKE_FILES + "root_index.emplace(" + " \"${ARG_PREFIX}${relpath}\"," + " ${parent_sym}_dir.directory.add_file(" + " \"${leaf}\"," + " res_chars::${sym}_begin," + " res_chars::${sym}_end" + " )" + ")\;" + ) + endforeach() +endfunction() + +function(_cmrc_generate_intermediate_cpp lib_ns symbol outfile infile) + add_custom_command( + # This is the file we will generate + OUTPUT "${outfile}" + # These are the primary files that affect the output + DEPENDS "${infile}" "${_CMRC_SCRIPT}" + COMMAND + "${CMAKE_COMMAND}" + -D_CMRC_GENERATE_MODE=TRUE + -DNAMESPACE=${lib_ns} + -DSYMBOL=${symbol} + "-DINPUT_FILE=${infile}" + "-DOUTPUT_FILE=${outfile}" + -P "${_CMRC_SCRIPT}" + COMMENT "Generating intermediate file for ${infile}" + ) +endfunction() + +function(_cm_encode_fpath var fpath) + string(MAKE_C_IDENTIFIER "${fpath}" ident) + string(MD5 hash "${fpath}") + string(SUBSTRING "${hash}" 0 4 hash) + set(${var} f_${hash}_${ident} PARENT_SCOPE) +endfunction() From b12e8a3a8b08fc5141c8dd696077d650b3a59280 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20L=C3=BCke?= Date: Sat, 21 Dec 2024 15:17:26 +0100 Subject: [PATCH 07/19] build a mnode resource library containing the vme meta data --- CMakeLists.txt | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b18e0a8..0a1a55e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,6 +7,8 @@ if (CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR) set(MESYTEC_MNODE_MAIN_PROJECT ON) endif() +list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake) + set(CMAKE_EXPORT_COMPILE_COMMANDS ON) ## Create binaries in the root of the build directory set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) @@ -15,6 +17,13 @@ set(CMAKE_VERBOSE_MAKEFILE ON CACHE BOOL "ON") set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) -add_subdirectory(proto) +include(CMakeRC) +cmrc_add_resource_library(mnode-resources + ALIAS mnode::resources NAMESPACE mnode::resources + data/vme_base_configs.json + data/vme_module_data_sources.json +) + add_subdirectory(external) +add_subdirectory(proto) add_subdirectory(src) From 25286dd9d20818cb9d33ea1b1739739aa38fc3fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20L=C3=BCke?= Date: Sat, 21 Dec 2024 15:18:47 +0100 Subject: [PATCH 08/19] add an analysis plugin api sketch --- src/tools/mana_replay_api.h | 81 +++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 src/tools/mana_replay_api.h diff --git a/src/tools/mana_replay_api.h b/src/tools/mana_replay_api.h new file mode 100644 index 0000000..72e4847 --- /dev/null +++ b/src/tools/mana_replay_api.h @@ -0,0 +1,81 @@ +#ifndef DA93DC95_9F70_4B58_9B6C_5E32D3811E48 +#define DA93DC95_9F70_4B58_9B6C_5E32D3811E48 + +#include +#include + +#ifdef __cplusplus +extern "C" +#endif +{ + +typedef struct +{ + const char *name; + size_t size; +} array_descriptor_t; + +typedef struct +{ + const char *module_name; + const char *module_type; + array_descriptor_t *data_sources; + size_t data_source_count; +} module_descriptor_t; + +typedef struct +{ + const char *event_name; + module_descriptor_t *modules; + size_t module_count; +} event_descriptor_t; + +typedef struct +{ + const char *listfile_name; + event_descriptor_t *events; + size_t event_count; +} run_descriptor_t; + +typedef struct +{ + const float *data; + size_t size; +} const_span_t; + +typedef struct +{ + const_span_t *data_arrays; + size_t data_array_count; +} module_data_t; + +typedef struct +{ + module_data_t *modules; + size_t module_count; +} event_data_t; + +#define MANA_DEFINE_PLUGIN_INIT(name) \ + void *name() + +#define MANA_DEFINE_PLUGIN_SHUTDOWN(name) \ + void name(void *context) + +#define MANA_DEFINE_PLUGIN_BEGIN_RUN(name) \ + void name(void *context, run_descriptor_t run_descriptor) + +#define MANA_DEFINE_PLUGIN_END_RUN(name) \ + void name(void *context, run_descriptor_t run_descriptor) + +#define MANA_DEFINE_PLUGIN_EVENT_DATA(name) \ + void name(void *context, int eventIndex, event_data_t event_data) + +typedef MANA_DEFINE_PLUGIN_BEGIN_RUN(mana_init_t); +typedef MANA_DEFINE_PLUGIN_SHUTDOWN(mana_shutdown_t); +typedef MANA_DEFINE_PLUGIN_BEGIN_RUN(mana_begin_run_t); +typedef MANA_DEFINE_PLUGIN_BEGIN_RUN(mana_end_run_t); +typedef MANA_DEFINE_PLUGIN_EVENT_DATA(mana_event_data_t); + +} + +#endif /* DA93DC95_9F70_4B58_9B6C_5E32D3811E48 */ From 8e20403adba6b27221535ec0a4642d0e4c2bfa93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20L=C3=BCke?= Date: Sat, 21 Dec 2024 15:19:21 +0100 Subject: [PATCH 09/19] update mesytec-mvlc for a crash fix --- external/mesytec-mvlc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/external/mesytec-mvlc b/external/mesytec-mvlc index 51cf605..7dec563 160000 --- a/external/mesytec-mvlc +++ b/external/mesytec-mvlc @@ -1 +1 @@ -Subproject commit 51cf6051d87a52984fe7a8feaf6f3516be5358cd +Subproject commit 7dec563d2b5abbfb83b843457f6c7c446b987f50 From 5da3276b3e81a521c8596e9e0cb1a7582ca9e310 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20L=C3=BCke?= Date: Sat, 21 Dec 2024 15:21:12 +0100 Subject: [PATCH 10/19] begin work on a mini analysis replay tool --- src/tools/CMakeLists.txt | 6 ++ src/tools/mana_auto_replay.cc | 180 ++++++++++++++++++++++++++++++++++ 2 files changed, 186 insertions(+) create mode 100644 src/tools/mana_auto_replay.cc diff --git a/src/tools/CMakeLists.txt b/src/tools/CMakeLists.txt index 20a8162..59d9421 100644 --- a/src/tools/CMakeLists.txt +++ b/src/tools/CMakeLists.txt @@ -22,6 +22,12 @@ add_mnode_dev_executable(mesy_nng_push_pull_main) add_mnode_dev_executable(mesy_nng_pub_producer) add_mnode_dev_executable(mesy_nng_sub_consumer) +find_package(Boost COMPONENTS filesystem system) +if (Boost_FOUND) + add_mnode_dev_executable(mana_auto_replay) + target_link_libraries(mana_auto_replay PRIVATE nlohmann_json::nlohmann_json mnode::resources Boost::filesystem Boost::system) +endif() + add_mnode_proto_dev_executable(mnode_proto_test1) add_mnode_proto_dev_executable(mnode_proto_ping_client) add_mnode_proto_dev_executable(mnode_proto_ping_server) diff --git a/src/tools/mana_auto_replay.cc b/src/tools/mana_auto_replay.cc new file mode 100644 index 0000000..0dccbc7 --- /dev/null +++ b/src/tools/mana_auto_replay.cc @@ -0,0 +1,180 @@ +// mana - mnode analysis / mini analysis +// usage: mana_auto_replay +// +// open the file +// read preamble +// create crateconfig from preamble data +// +// setup: +// for each event in the config: +// for each module: +// check for module type in meta data +// find module type in vme_module_data_sources.json +// for each filter in the modules data_sources: +// calculate array size (use float as the storage type for now) +// reserve buffer space for the array +// +// replay: +// for each event in the listfile: +// for each module in the event: +// locate the list of filters for the crate, event and module index triplet +// for each filter: +// match it against every word in the module data +// if a word matches extract address and value +// store value in the reserved array buffer +// +// -> extracted u32 data is stored in the buffer space for this event +// what now? +// - histogram +// - make arrays available to python and test numpy +// - crrate root histograms and accumulate +// - create root trees or the new rntuples(?) +// -> want plugins. similar to the mvme listfile_reader but on analysis data + +#include // mnode::resources +#include +#include +#include +#include +#include "mana_replay_api.h" + +CMRC_DECLARE(mnode::resources); + +using namespace mesytec; +using namespace mesytec::mnode; + +namespace arena +{ + +// source: https://blog.xoria.org/rounding-up/ +inline int64_t round_up(int64_t n, int64_t p) +{ + int64_t mask = p - 1; + return (n + mask) & ~mask; +} + +struct Arena +{ + struct Segment + { + std::vector data; + size_t used; + + explicit Segment(size_t size) + : data(size) + , used(0) + { + } + inline size_t free() const { return data.size() - used; } + inline u8 *cur() { return data.data() + used; } + }; + + std::list segments; + size_t current = 0; + + inline Segment *current_segment() + { + if (current < segments.size()) + { + auto it = segments.begin(); + std::advance(it, current); + return &(*it); + } + + return nullptr; + } + + inline u8 *push_size(size_t required) + { + required = round_up(required, 16); + + if (auto segment = current_segment(); !segment || segment->free() < required) + { + // could waste segments if required > default size of 1u << 20 but that's fine for now + segments.emplace_back( + Arena::Segment(std::max(required, static_cast(1u << 20)))); + current = segments.size() - 1; + } + + auto segment = current_segment(); + assert(segment); + assert(segment->free() >= required); + u8 *result = segment->cur(); + std::memset(result, 0, required); + segment->used += required; + return result; + } + + template T *push_t(size_t count = 1) + { + static_assert(std::is_trivial::value, "T must be a trivial type"); + return reinterpret_cast(push_size(sizeof(T) * count)); + } +}; + +}; // namespace arena + +struct ListfileContext +{ + mvlc::listfile::ZipReader zipReader; + mvlc::listfile::ReadHandle *readHandle; + mvlc::listfile::ListfileReaderHelper readerHelper; + mvlc::CrateConfig crateConfig; +}; + +std::optional make_listfile_context(const std::string &filename) +{ + try + { + ListfileContext ctx{}; + ctx.zipReader.openArchive(filename); + ctx.readHandle = ctx.zipReader.openEntry(ctx.zipReader.firstListfileEntryName()); + ctx.readerHelper = mvlc::listfile::make_listfile_reader_helper(ctx.readHandle); + auto configData = ctx.readerHelper.preamble.findCrateConfig(); + if (!configData) + { + std::cerr << fmt::format("No MVLC crate config found in {}\n", filename); + return {}; + } + + ctx.crateConfig = mvlc::crate_config_from_yaml(configData->contentsToString()); + std::cout << fmt::format("Found MVLC crate config in {}\n", filename); + for (size_t i=0; i\n", argv[0]); + return 1; + } + + std::string filename = argv[1]; + auto listfileContext = make_listfile_context(filename); + + if (!listfileContext) + return 1; + + return 0; +} From a6bc4d132936887bbd6e31e3ecef4e198b516a52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20L=C3=BCke?= Date: Sat, 21 Dec 2024 19:11:17 +0100 Subject: [PATCH 11/19] working mana_replay but doesn't do any analysis yet reaches 210 MiB/s with is690-9Li_3H_run094 --- external/mesytec-mvlc | 2 +- src/tools/mana_auto_replay.cc | 158 ++++++++++++++++++++++++++++++++-- src/tools/mana_replay_api.h | 9 ++ 3 files changed, 160 insertions(+), 9 deletions(-) diff --git a/external/mesytec-mvlc b/external/mesytec-mvlc index 7dec563..1c1f32d 160000 --- a/external/mesytec-mvlc +++ b/external/mesytec-mvlc @@ -1 +1 @@ -Subproject commit 7dec563d2b5abbfb83b843457f6c7c446b987f50 +Subproject commit 1c1f32dbc587747219a942aabe2a2668fab1ae82 diff --git a/src/tools/mana_auto_replay.cc b/src/tools/mana_auto_replay.cc index 0dccbc7..5c06c3e 100644 --- a/src/tools/mana_auto_replay.cc +++ b/src/tools/mana_auto_replay.cc @@ -55,6 +55,12 @@ inline int64_t round_up(int64_t n, int64_t p) struct Arena { + Arena() = default; + ~Arena() = default; + Arena(const Arena &) = delete; + Arena &operator=(const Arena &) = delete; + Arena(Arena &&) = delete; + Arena &operator=(Arena &&) = delete; struct Segment { std::vector data; @@ -105,7 +111,7 @@ struct Arena return result; } - template T *push_t(size_t count = 1) + template T *push_t(size_t count = 1) { static_assert(std::is_trivial::value, "T must be a trivial type"); return reinterpret_cast(push_size(sizeof(T) * count)); @@ -116,19 +122,26 @@ struct Arena struct ListfileContext { - mvlc::listfile::ZipReader zipReader; + std::unique_ptr zipReader; mvlc::listfile::ReadHandle *readHandle; mvlc::listfile::ListfileReaderHelper readerHelper; mvlc::CrateConfig crateConfig; + + ListfileContext() = default; + ListfileContext(const ListfileContext &) = delete; + ListfileContext &operator=(const ListfileContext &) = delete; + ListfileContext(ListfileContext &&) = default; + ListfileContext &operator=(ListfileContext &&) = default; }; std::optional make_listfile_context(const std::string &filename) { try { - ListfileContext ctx{}; - ctx.zipReader.openArchive(filename); - ctx.readHandle = ctx.zipReader.openEntry(ctx.zipReader.firstListfileEntryName()); + ListfileContext ctx; + ctx.zipReader = std::make_unique(); + ctx.zipReader->openArchive(filename); + ctx.readHandle = ctx.zipReader->openEntry(ctx.zipReader->firstListfileEntryName()); ctx.readerHelper = mvlc::listfile::make_listfile_reader_helper(ctx.readHandle); auto configData = ctx.readerHelper.preamble.findCrateConfig(); if (!configData) @@ -139,17 +152,51 @@ std::optional make_listfile_context(const std::string &filename ctx.crateConfig = mvlc::crate_config_from_yaml(configData->contentsToString()); std::cout << fmt::format("Found MVLC crate config in {}\n", filename); - for (size_t i=0; i make_parser_context(const mvlc::CrateConfig &crateConfig, + ParserContext::Callbacks callbacks) +{ + try + { + ParserContext ctx{}; + ctx.parser = mvlc::readout_parser::make_readout_parser(crateConfig.stacks); + ctx.crateConfig = crateConfig; + ctx.callbacks = callbacks; return ctx; } catch (const std::exception &e) @@ -159,6 +206,46 @@ std::optional make_listfile_context(const std::string &filename } } +struct AnalysisContext +{ +}; + +void event_data_callback(AnalysisContext *ctx, int crateIndex, int eventIndex, + const mvlc::readout_parser::ModuleData *moduleDataList, + unsigned moduleCount) +{ + assert(moduleDataList); + // std::cout << fmt::format("ReadoutEvent: ctx={}, crateId={}, eventIndex={}, moduleCount={}\n", + // fmt::ptr(ctx), crateIndex, eventIndex, moduleCount); +} + +void system_event_callback(AnalysisContext *ctx, int crateIndex, const u32 *header, u32 size) +{ + assert(header); + // std::cout << fmt::format("SystemEvent: ctx={}, crateId={}, size={}\n", fmt::ptr(ctx), + // crateIndex, + // size); +} + +size_t process_one_buffer(size_t bufferNumber, ListfileContext &listfileContext, + ParserContext &parserContext, AnalysisContext &analysisContext) +{ + listfileContext.readerHelper.destBuf().clear(); + auto buffer = mvlc::listfile::read_next_buffer(listfileContext.readerHelper); + + if (!buffer->used()) + return 0; + + auto bufferView = buffer->viewU32(); + parserContext.parser.userContext = &analysisContext; + + mvlc::readout_parser::parse_readout_buffer( + listfileContext.readerHelper.bufferFormat, parserContext.parser, parserContext.callbacks, + parserContext.counters, bufferNumber, bufferView.data(), bufferView.size()); + + return buffer->used(); +} + int main(int argc, char *argv[]) { auto f = cmrc::mnode::resources::get_filesystem().open("data/vme_module_data_sources.json"); @@ -176,5 +263,60 @@ int main(int argc, char *argv[]) if (!listfileContext) return 1; + std::optional analysisContext = AnalysisContext(); + + if (!analysisContext) + return 1; + + auto event_data = [](void *ctx, int crateIndex, int eventIndex, + const mvlc::readout_parser::ModuleData *moduleDataList, + unsigned moduleCount) + { + event_data_callback(static_cast(ctx), crateIndex, eventIndex, + moduleDataList, moduleCount); + }; + + auto system_event = [](void *ctx, int crateIndex, const u32 *header, u32 size) + { system_event_callback(static_cast(ctx), crateIndex, header, size); }; + + auto parserContext = + make_parser_context(listfileContext->crateConfig, {event_data, system_event}); + + if (!parserContext) + return 1; + + size_t bufferNumber = 0; + size_t totalBytesProcessed = 0; + size_t bytesProcessed = 0; + const std::chrono::milliseconds ReportInterval(500); + mvlc::util::Stopwatch sw; + + auto report = + [](const mvlc::util::Stopwatch sw, size_t bufferNumber, size_t totalBytesProcessed) + { + auto s = sw.get_elapsed().count() / (1000.0 * 1000.0); + auto bytesPerSecond = totalBytesProcessed / s; + auto MiBPerSecond = bytesPerSecond / (1u << 20); + std::cout << fmt::format("Processed {} buffers, {} bytes. t={} s, rate={} MiB/s\n", + bufferNumber, totalBytesProcessed, s, MiBPerSecond); + }; + + do + { + bytesProcessed = + process_one_buffer(bufferNumber, *listfileContext, *parserContext, *analysisContext); + totalBytesProcessed += bytesProcessed; + ++bufferNumber; + + if (auto elapsed = sw.get_interval(); elapsed >= ReportInterval) + { + report(sw, bufferNumber, totalBytesProcessed); + sw.interval(); + } + } + while (bytesProcessed > 0); + + report(sw, bufferNumber, totalBytesProcessed); + return 0; } diff --git a/src/tools/mana_replay_api.h b/src/tools/mana_replay_api.h index 72e4847..f6e2bec 100644 --- a/src/tools/mana_replay_api.h +++ b/src/tools/mana_replay_api.h @@ -9,6 +9,15 @@ extern "C" #endif { +// descriptors - daq structure +// daq -> events -> modules -> data_sources +// alternative concepts: +// crate -> triggers -> modules -> data_sources +// example data sources: "amplitude", "channel_time", "timestamp" +// data is float, data sources have a size of at least 1 +// todo: add number of valid bits in the data source +// todo: rng handling? + typedef struct { const char *name; From a679f8aca78a6b460f24f8835c33be91a31b243f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20L=C3=BCke?= Date: Mon, 23 Dec 2024 12:58:48 +0100 Subject: [PATCH 12/19] cmake: add googletest via FetchContent --- CMakeLists.txt | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0a1a55e..3fc2a6a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,6 +17,23 @@ set(CMAKE_VERBOSE_MAKEFILE ON CACHE BOOL "ON") set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) +option(MNODE_BUILD_TESTS "Build mnode test binaries" ${MESYTEC_MNODE_MAIN_PROJECT}) + +if (MNODE_BUILD_TESTS) + find_package(GTest CONFIG) + if (NOT GTest_FOUND) + include(FetchContent) + FetchContent_Declare(googletest URL https://github.com/google/googletest/archive/refs/tags/v1.15.2.zip) + # For Windows: Prevent overriding the parent project's compiler/linker settings + set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) + FetchContent_MakeAvailable(googletest) + endif() + + message("-- mnode: Building tests") + include(CTest) + enable_testing() +endif() + include(CMakeRC) cmrc_add_resource_library(mnode-resources ALIAS mnode::resources NAMESPACE mnode::resources From 2087933facdda612d350e5b350e5e9b0a0da2369 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20L=C3=BCke?= Date: Mon, 23 Dec 2024 12:59:27 +0100 Subject: [PATCH 13/19] move round_up() into mnode_math --- include/mesytec-mnode/mnode_math.h | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 include/mesytec-mnode/mnode_math.h diff --git a/include/mesytec-mnode/mnode_math.h b/include/mesytec-mnode/mnode_math.h new file mode 100644 index 0000000..a9693c2 --- /dev/null +++ b/include/mesytec-mnode/mnode_math.h @@ -0,0 +1,18 @@ +#ifndef C536E080_25D7_476D_B8E3_25912B9CFC3B +#define C536E080_25D7_476D_B8E3_25912B9CFC3B + +#include + +namespace mesytec::mnode +{ +// round n up to the nearest multiple of p +// source: https://blog.xoria.org/rounding-up/ +inline int64_t round_up(int64_t n, int64_t p) +{ + int64_t mask = p - 1; + return (n + mask) & ~mask; +} + +} + +#endif /* C536E080_25D7_476D_B8E3_25912B9CFC3B */ From 46efb1cff78ed7c49825bc380772886d33546b9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20L=C3=BCke?= Date: Mon, 23 Dec 2024 12:59:57 +0100 Subject: [PATCH 14/19] move arena into internal header, add mana gtest --- src/CMakeLists.txt | 10 +++ src/internal/mana_arena.h | 116 +++++++++++++++++++++++++++++++++ src/mana.test.cc | 36 +++++++++++ src/tools/mana_auto_replay.cc | 118 ++++++++++------------------------ 4 files changed, 196 insertions(+), 84 deletions(-) create mode 100644 src/internal/mana_arena.h create mode 100644 src/mana.test.cc diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e756158..cd6b8bc 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -9,3 +9,13 @@ target_compile_features(mesytec-mnode PRIVATE cxx_std_17) target_compile_options(mesytec-mnode PRIVATE ${MVLC_NNG_MNODE_WARN_FLAGS}) add_subdirectory(tools) + +if (MNODE_BUILD_TESTS) + function (add_mnode_gtest name) + add_executable(test_${name} ${name}.test.cc) + target_link_libraries(test_${name} PRIVATE mesytec-mnode GTest::gtest_main) + add_test(NAME name COMMAND $) + endfunction() + + add_mnode_gtest(mana) +endif() diff --git a/src/internal/mana_arena.h b/src/internal/mana_arena.h new file mode 100644 index 0000000..7de87ee --- /dev/null +++ b/src/internal/mana_arena.h @@ -0,0 +1,116 @@ +#ifndef F20CF38F_7327_4608_8307_6AE058041CD5 +#define F20CF38F_7327_4608_8307_6AE058041CD5 + +#include +#include +#include +#include + +namespace mesytec::mnode::mana +{ + +class Arena +{ + public: + static constexpr size_t initial_segment_size = 1u << 20; + static constexpr size_t default_pad = 8; + + Arena() = default; + ~Arena() = default; + + Arena(Arena &&other); + Arena &operator=(Arena &&other); + + // pushes at least the required amount of memory onto the arena. + // 'required' is rounded up to the nearest multiple of 'default_pad' to make + // subsequent allocations aligned. + u8 *push_size(size_t required) + { + size_t padded = round_up(required, default_pad); + size_t pad_waste = padded - required; + required = padded; + + if (!segment_ || segment_->free() < required) + { + // could waste complete segments if required > default size of 1u << 20 but that's fine + // for now + segment_ = + &segments_.emplace_back(Arena::Segment(std::max(required, initial_segment_size))); + } + + assert(segment_ && segment_->free() >= required); + + std::memset(segment_->cur(), 0, required); + segment_->used += required; + ++allocations_; + pad_waste_ += pad_waste; + return segment_->cur(); + } + + template T *push_t(size_t count = 1) + { + static_assert(std::is_trivial::value, "T must be a trivial type"); + return reinterpret_cast(push_size(sizeof(T) * count)); + } + + const char *push_cstr(const std::string &str) + { + auto mem = push_size(str.size() + 1); + std::memcpy(mem, str.c_str(), str.size()); + return reinterpret_cast(mem); + } + + void reset() + { + std::for_each(std::begin(segments_), std::end(segments_), + [](Segment &seg) { seg.reset(); }); + segment_ = segments_.empty() ? nullptr : &segments_.front(); + allocations_ = 0; + pad_waste_ = 0; + } + + size_t allocations() const { return allocations_; } + size_t pad_waste() const { return pad_waste_; } + size_t segment_count() const { return segments_.size(); } + size_t capacity() const + { + auto accu = [](size_t sum, const Segment &seg) { return sum + seg.data.size(); }; + return std::accumulate(std::begin(segments_), std::end(segments_), static_cast(0u), + accu); + } + + size_t used() const + { + auto accu = [](size_t sum, const Segment &seg) { return sum + seg.used; }; + return std::accumulate(std::begin(segments_), std::end(segments_), static_cast(0u), + accu) - pad_waste_; + } + + private: + Arena(const Arena &) = delete; + Arena &operator=(const Arena &) = delete; + + struct Segment + { + std::vector data; + size_t used; + + explicit Segment(size_t size) + : data(size) + , used(0) + { + } + size_t free() const { return data.size() - used; } + u8 *cur() { return data.data() + used; } + void reset() { used = 0; } + }; + + std::list segments_; + Segment *segment_ = nullptr; + size_t allocations_ = 0; + size_t pad_waste_ = 0; +}; + +} // namespace mesytec::mnode::mana + +#endif /* F20CF38F_7327_4608_8307_6AE058041CD5 */ diff --git a/src/mana.test.cc b/src/mana.test.cc new file mode 100644 index 0000000..477ef0f --- /dev/null +++ b/src/mana.test.cc @@ -0,0 +1,36 @@ +#include +#include +#include "internal/mana_arena.h" + +using namespace mesytec::mnode; + +TEST(mnode_mana, Arena) +{ + mana::Arena arena; + + ASSERT_EQ(arena.allocations(), 0); + ASSERT_EQ(arena.pad_waste(), 0); + ASSERT_EQ(arena.segment_count(), 0); + ASSERT_EQ(arena.capacity(), 0); + ASSERT_EQ(arena.used(), 0); + + for (size_t i=0; i<10; ++i) + { + auto mem = arena.push_size(mana::Arena::default_pad + 2); + ASSERT_NE(mem, nullptr); + } + + ASSERT_EQ(arena.allocations(), 10); + ASSERT_GE(arena.pad_waste(), 0); + ASSERT_GE(arena.segment_count(), 1); + ASSERT_GE(arena.capacity(), 10 * (mana::Arena::default_pad + 2)); + ASSERT_EQ(arena.used(), 10 * (mana::Arena::default_pad + 2)); + + arena.reset(); + + ASSERT_EQ(arena.allocations(), 0); + ASSERT_EQ(arena.pad_waste(), 0); + ASSERT_GE(arena.segment_count(), 1); + ASSERT_GE(arena.capacity(), 10 * (mana::Arena::default_pad + 2)); + ASSERT_EQ(arena.used(), 0); +} diff --git a/src/tools/mana_auto_replay.cc b/src/tools/mana_auto_replay.cc index 5c06c3e..af8d516 100644 --- a/src/tools/mana_auto_replay.cc +++ b/src/tools/mana_auto_replay.cc @@ -34,92 +34,17 @@ #include // mnode::resources #include #include +#include #include #include #include "mana_replay_api.h" +#include "internal/mana_arena.h" CMRC_DECLARE(mnode::resources); using namespace mesytec; using namespace mesytec::mnode; -namespace arena -{ - -// source: https://blog.xoria.org/rounding-up/ -inline int64_t round_up(int64_t n, int64_t p) -{ - int64_t mask = p - 1; - return (n + mask) & ~mask; -} - -struct Arena -{ - Arena() = default; - ~Arena() = default; - Arena(const Arena &) = delete; - Arena &operator=(const Arena &) = delete; - Arena(Arena &&) = delete; - Arena &operator=(Arena &&) = delete; - struct Segment - { - std::vector data; - size_t used; - - explicit Segment(size_t size) - : data(size) - , used(0) - { - } - inline size_t free() const { return data.size() - used; } - inline u8 *cur() { return data.data() + used; } - }; - - std::list segments; - size_t current = 0; - - inline Segment *current_segment() - { - if (current < segments.size()) - { - auto it = segments.begin(); - std::advance(it, current); - return &(*it); - } - - return nullptr; - } - - inline u8 *push_size(size_t required) - { - required = round_up(required, 16); - - if (auto segment = current_segment(); !segment || segment->free() < required) - { - // could waste segments if required > default size of 1u << 20 but that's fine for now - segments.emplace_back( - Arena::Segment(std::max(required, static_cast(1u << 20)))); - current = segments.size() - 1; - } - - auto segment = current_segment(); - assert(segment); - assert(segment->free() >= required); - u8 *result = segment->cur(); - std::memset(result, 0, required); - segment->used += required; - return result; - } - - template T *push_t(size_t count = 1) - { - static_assert(std::is_trivial::value, "T must be a trivial type"); - return reinterpret_cast(push_size(sizeof(T) * count)); - } -}; - -}; // namespace arena - struct ListfileContext { std::unique_ptr zipReader; @@ -167,7 +92,7 @@ std::optional make_listfile_context(const std::string &filename } } - return std::move(ctx); + return ctx; } catch (const std::exception &e) { @@ -208,23 +133,46 @@ std::optional make_parser_context(const mvlc::CrateConfig &crateC struct AnalysisContext { + std::unique_ptr arena; + run_descriptor_t *runDescriptor = nullptr; }; +std::optional make_mana(const mvlc::CrateConfig &crateConfig, + const nlohmann::json &jModuleDataSources) +{ + try + { + std::map moduleInfoByType; + for (const auto &mod_: jModuleDataSources["modules"]) + moduleInfoByType[mod_["type_name"]] = mod_; + + AnalysisContext ctx; + ctx.arena = std::make_unique(); + auto arena = ctx.arena.get(); + + return ctx; + } + catch (const std::exception &e) + { + std::cerr << fmt::format("Error: {}\n", e.what()); + return {}; + } +} + void event_data_callback(AnalysisContext *ctx, int crateIndex, int eventIndex, const mvlc::readout_parser::ModuleData *moduleDataList, unsigned moduleCount) { assert(moduleDataList); - // std::cout << fmt::format("ReadoutEvent: ctx={}, crateId={}, eventIndex={}, moduleCount={}\n", - // fmt::ptr(ctx), crateIndex, eventIndex, moduleCount); + std::cout << fmt::format("ReadoutEvent: ctx={}, crateId={}, eventIndex={}, moduleCount={}\n", + fmt::ptr(ctx), crateIndex, eventIndex, moduleCount); } void system_event_callback(AnalysisContext *ctx, int crateIndex, const u32 *header, u32 size) { assert(header); - // std::cout << fmt::format("SystemEvent: ctx={}, crateId={}, size={}\n", fmt::ptr(ctx), - // crateIndex, - // size); + std::cout << fmt::format("SystemEvent: ctx={}, crateId={}, size={}\n", fmt::ptr(ctx), + crateIndex, size); } size_t process_one_buffer(size_t bufferNumber, ListfileContext &listfileContext, @@ -263,11 +211,13 @@ int main(int argc, char *argv[]) if (!listfileContext) return 1; - std::optional analysisContext = AnalysisContext(); + auto analysisContext = make_mana(listfileContext->crateConfig, jModuleDataSources); if (!analysisContext) return 1; + return 42; + auto event_data = [](void *ctx, int crateIndex, int eventIndex, const mvlc::readout_parser::ModuleData *moduleDataList, unsigned moduleCount) From fa897ea233e6ff9bfd455fad1bf1e5f6fc90ada1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20L=C3=BCke?= Date: Mon, 23 Dec 2024 13:00:31 +0100 Subject: [PATCH 15/19] some replay api changes - still unsure about the design --- src/tools/mana_replay_api.h | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/src/tools/mana_replay_api.h b/src/tools/mana_replay_api.h index f6e2bec..fab9fec 100644 --- a/src/tools/mana_replay_api.h +++ b/src/tools/mana_replay_api.h @@ -9,7 +9,7 @@ extern "C" #endif { -// descriptors - daq structure +// descriptors - daq tree structure // daq -> events -> modules -> data_sources // alternative concepts: // crate -> triggers -> modules -> data_sources @@ -18,10 +18,18 @@ extern "C" // todo: add number of valid bits in the data source // todo: rng handling? +typedef enum +{ + dt_uint32, + dt_float, +} data_type_t; + typedef struct { - const char *name; - size_t size; + const char *array_name; + data_type_t data_type; + size_t array_size; + size_t valid_bits; // belongs into data_type_t } array_descriptor_t; typedef struct @@ -46,15 +54,17 @@ typedef struct size_t event_count; } run_descriptor_t; -typedef struct -{ - const float *data; - size_t size; -} const_span_t; +// data views - daq data typedef struct { - const_span_t *data_arrays; + float *data; + size_t size; +} array_t; + +typedef struct +{ + array_t *data_arrays; size_t data_array_count; } module_data_t; From 6d93197f86e56403f7ca5479be505cc388abaa7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20L=C3=BCke?= Date: Wed, 25 Dec 2024 03:17:53 +0100 Subject: [PATCH 16/19] mana::Arena: fixes and segment limit and tests --- src/CMakeLists.txt | 4 +- src/internal/mana_arena.h | 33 +++++++++++----- src/mana.test.cc | 79 ++++++++++++++++++++++++++++++++++++++- 3 files changed, 103 insertions(+), 13 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index cd6b8bc..3a2f614 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,4 +1,4 @@ -set(MVLC_NNG_MNODE_WARN_FLAGS -Wall -Wextra -Wpedantic) +set(MVLC_NNG_MNODE_WARN_FLAGS -Wall -Wextra -Wpedantic -Werror=return-type) add_library(mesytec-mnode mnode_nng.cc mnode_nng_async.cc mnode_nng_proto.cc) target_include_directories(mesytec-mnode @@ -13,7 +13,7 @@ add_subdirectory(tools) if (MNODE_BUILD_TESTS) function (add_mnode_gtest name) add_executable(test_${name} ${name}.test.cc) - target_link_libraries(test_${name} PRIVATE mesytec-mnode GTest::gtest_main) + target_link_libraries(test_${name} PRIVATE mesytec-mnode GTest::gtest_main spdlog) add_test(NAME name COMMAND $) endfunction() diff --git a/src/internal/mana_arena.h b/src/internal/mana_arena.h index 7de87ee..097d3f5 100644 --- a/src/internal/mana_arena.h +++ b/src/internal/mana_arena.h @@ -14,6 +14,7 @@ class Arena public: static constexpr size_t initial_segment_size = 1u << 20; static constexpr size_t default_pad = 8; + static constexpr size_t default_max_segments = 1; Arena() = default; ~Arena() = default; @@ -32,19 +33,27 @@ class Arena if (!segment_ || segment_->free() < required) { - // could waste complete segments if required > default size of 1u << 20 but that's fine - // for now - segment_ = - &segments_.emplace_back(Arena::Segment(std::max(required, initial_segment_size))); + if (segment_count() < max_segments()) + { + // could waste complete segments if required > default size of 1u << 20 but that's + // fine for now + segment_ = &segments_.emplace_back( + Arena::Segment(std::max(required, initial_segment_size))); + } + else + { + throw std::bad_alloc(); + } } assert(segment_ && segment_->free() >= required); - std::memset(segment_->cur(), 0, required); + auto result = segment_->cur(); + std::memset(result, 0, required); segment_->used += required; ++allocations_; pad_waste_ += pad_waste; - return segment_->cur(); + return result; } template T *push_t(size_t count = 1) @@ -53,11 +62,11 @@ class Arena return reinterpret_cast(push_size(sizeof(T) * count)); } - const char *push_cstr(const std::string &str) + char *push_cstr(const std::string &str) { auto mem = push_size(str.size() + 1); std::memcpy(mem, str.c_str(), str.size()); - return reinterpret_cast(mem); + return reinterpret_cast(mem); } void reset() @@ -69,6 +78,7 @@ class Arena pad_waste_ = 0; } + size_t max_segments() const { return max_segments_; } size_t allocations() const { return allocations_; } size_t pad_waste() const { return pad_waste_; } size_t segment_count() const { return segments_.size(); } @@ -83,9 +93,13 @@ class Arena { auto accu = [](size_t sum, const Segment &seg) { return sum + seg.used; }; return std::accumulate(std::begin(segments_), std::end(segments_), static_cast(0u), - accu) - pad_waste_; + accu) - + pad_waste_; } + const u8 *cur_begin() const { return segment_ ? segment_->data.data() : nullptr; } + const u8 *cur_end() const { return segment_ ? segment_->cur() : nullptr; } + private: Arena(const Arena &) = delete; Arena &operator=(const Arena &) = delete; @@ -105,6 +119,7 @@ class Arena void reset() { used = 0; } }; + size_t max_segments_ = default_max_segments; std::list segments_; Segment *segment_ = nullptr; size_t allocations_ = 0; diff --git a/src/mana.test.cc b/src/mana.test.cc index 477ef0f..3d67cd6 100644 --- a/src/mana.test.cc +++ b/src/mana.test.cc @@ -1,10 +1,13 @@ #include #include #include "internal/mana_arena.h" +#include +#include "tools/mana_replay_api.h" +#include "tools/mana_lib.hpp" using namespace mesytec::mnode; -TEST(mnode_mana, Arena) +TEST(mnode_mana_arena, push_reset_push) { mana::Arena arena; @@ -14,7 +17,7 @@ TEST(mnode_mana, Arena) ASSERT_EQ(arena.capacity(), 0); ASSERT_EQ(arena.used(), 0); - for (size_t i=0; i<10; ++i) + for (size_t i = 0; i < 10; ++i) { auto mem = arena.push_size(mana::Arena::default_pad + 2); ASSERT_NE(mem, nullptr); @@ -33,4 +36,76 @@ TEST(mnode_mana, Arena) ASSERT_GE(arena.segment_count(), 1); ASSERT_GE(arena.capacity(), 10 * (mana::Arena::default_pad + 2)); ASSERT_EQ(arena.used(), 0); + + for (size_t i = 0; i < 10; ++i) + { + auto mem = arena.push_size(mana::Arena::default_pad + 2); + ASSERT_NE(mem, nullptr); + } + + ASSERT_EQ(arena.allocations(), 10); + ASSERT_GE(arena.pad_waste(), 0); + ASSERT_GE(arena.segment_count(), 1); + ASSERT_GE(arena.capacity(), 10 * (mana::Arena::default_pad + 2)); + ASSERT_EQ(arena.used(), 10 * (mana::Arena::default_pad + 2)); +} + +TEST(mnode_mana_offset_ptr, basic) +{ + using namespace mana; + + struct OffsetPtrTest + { + u32 a; + mana_offset_ptr_t ptr0; // &a + mana_offset_ptr_t ptr1; // &b + u32 b; + }; + + mana::Arena arena; + + auto t = arena.push_t(); + t->a = 42; + t->b = 43; + + set(t->ptr0, &t->a); + set(t->ptr1, &t->b); + + ASSERT_EQ(get(t->ptr0), &t->a); + ASSERT_EQ(get(t->ptr1), &t->b); + ASSERT_EQ(get(t->ptr0), nullptr); + ASSERT_EQ(get(t->ptr1), nullptr); +} + +TEST(mnode_mana_offset_ptr, strings) +{ + using namespace mana; + + struct OffsetPtrTest + { + mana_offset_ptr_t ptr0; + mana_offset_ptr_t ptr1; + }; + + mana::Arena arena; + + auto t = arena.push_t(); + + auto s0 = arena.push_cstr("hello"); + auto s1 = arena.push_cstr("world"); + + spdlog::info("&t->ptr0={}, &t->ptr1={}", fmt::ptr(&t->ptr0), fmt::ptr(&t->ptr1)); + spdlog::info("s0={} @ {}, s1={} @ {}", s0, fmt::ptr(s0), s1, fmt::ptr(s1)); + + set(t->ptr0, s0); + set(t->ptr1, s1); + + ASSERT_EQ(get(t->ptr0), std::string("hello")); + ASSERT_EQ(get(t->ptr1), std::string("world")); + ASSERT_EQ(get(t->ptr0), nullptr); + ASSERT_EQ(get(t->ptr1), nullptr); + + set(t->ptr0, nullptr); + ASSERT_EQ(get(t->ptr0), nullptr); + ASSERT_EQ(get(t->ptr1), std::string("world")); } From 7751d487ed24f95fc29915803c0eae53a554eb6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20L=C3=BCke?= Date: Wed, 25 Dec 2024 03:19:00 +0100 Subject: [PATCH 17/19] math: add make_quiet_nan() --- include/mesytec-mnode/mnode_math.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/include/mesytec-mnode/mnode_math.h b/include/mesytec-mnode/mnode_math.h index a9693c2..0119f8e 100644 --- a/include/mesytec-mnode/mnode_math.h +++ b/include/mesytec-mnode/mnode_math.h @@ -2,6 +2,7 @@ #define C536E080_25D7_476D_B8E3_25912B9CFC3B #include +#include namespace mesytec::mnode { @@ -13,6 +14,13 @@ inline int64_t round_up(int64_t n, int64_t p) return (n + mask) & ~mask; } +inline double make_quiet_nan() +{ + double result = std::numeric_limits::quiet_NaN(); + assert(((uintptr_t)(result) & 0xffffffff) == 0); + return result; +} + } #endif /* C536E080_25D7_476D_B8E3_25912B9CFC3B */ From dfe5d7eb3b76b55feb70e3c36fddeb964266ac85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20L=C3=BCke?= Date: Wed, 25 Dec 2024 03:19:29 +0100 Subject: [PATCH 18/19] mana: unfinished offset ptr stuff --- src/tools/mana_auto_replay.cc | 390 ++++++++++++++++++++++++++++++---- src/tools/mana_lib.hpp | 68 ++++++ src/tools/mana_replay_api.h | 94 ++++---- 3 files changed, 473 insertions(+), 79 deletions(-) create mode 100644 src/tools/mana_lib.hpp diff --git a/src/tools/mana_auto_replay.cc b/src/tools/mana_auto_replay.cc index af8d516..5eff86a 100644 --- a/src/tools/mana_auto_replay.cc +++ b/src/tools/mana_auto_replay.cc @@ -37,8 +37,10 @@ #include #include #include +#include #include "mana_replay_api.h" #include "internal/mana_arena.h" +#include "tools/mana_lib.hpp" CMRC_DECLARE(mnode::resources); @@ -131,25 +133,357 @@ std::optional make_parser_context(const mvlc::CrateConfig &crateC } } +MANA_DEFINE_PLUGIN_INIT(mana_default_init) { return nullptr; } +MANA_DEFINE_PLUGIN_SHUTDOWN(mana_default_shutdown) {} +MANA_DEFINE_PLUGIN_BEGIN_RUN(mana_default_begin_run) {} +MANA_DEFINE_PLUGIN_END_RUN(mana_default_end_run) {} +MANA_DEFINE_PLUGIN_EVENT_DATA(mana_default_process_event) {} +MANA_DEFINE_PLUGIN_SYSTEM_EVENT(mana_default_system_event) {} + +static mana_plugin_t DefaultPlugin = {.init = mana_default_init, + .shutdown = mana_default_shutdown, + .begin_run = mana_default_begin_run, + .end_run = mana_default_end_run, + .process_event = mana_default_process_event}; + +struct DataSource +{ + mvlc::util::DataFilter filter; + mvlc::util::CacheEntry fAddress; + mvlc::util::CacheEntry fValue; + mvlc::util::span dest; +}; + struct AnalysisContext { std::unique_ptr arena; - run_descriptor_t *runDescriptor = nullptr; + mana_run_descriptor_t *runDescriptor = nullptr; + mvlc::util::span eventStorages; + std::vector>> dataSources; // eventIndex, moduleIndex, sourceIndex + mana_plugin_t outputPlugin = DefaultPlugin; + void *outputPluginContext = nullptr; + + size_t runDescriptorBytes = 0; + size_t eventStoragesBytes = 0; + + void process_module_data(const mvlc::readout_parser::DataBlock &data, DataSource &source) + { + std::fill(std::begin(source.dest), std::end(source.dest), mnode::make_quiet_nan()); + for (const u32 *word = data.data, *end = data.data + data.size; word < end; ++word) + { + if (mvlc::util::matches(source.filter, *word)) + { + u32 address = mvlc::util::extract(source.fAddress, *word); + u32 value = mvlc::util::extract(source.fValue, *word); + assert(address < source.dest.size()); + source.dest[address] = value; + } + } + } + + void process_module_data(const mvlc::readout_parser::DataBlock &data, std::vector &sources) + { + for (auto &source: sources) + { + process_module_data(data, source); + } + } + + void process_module_data(const mvlc::readout_parser::ModuleData &moduleData, + std::vector &sources) + { + mvlc::readout_parser::DataBlock data = moduleData.hasDynamic ? dynamic_span(moduleData) + : prefix_span(moduleData); + process_module_data(data, sources); + + } + + void process_event_data(int crateIndex, int eventIndex, + const mvlc::readout_parser::ModuleData *moduleDataList, + unsigned moduleCount) + { + std::cout << fmt::format( + "ReadoutEvent: ctx={}, crateId={}, eventIndex={}, moduleCount={}\n", fmt::ptr(this), + crateIndex, eventIndex, moduleCount); + + auto &eventSources = dataSources.at(eventIndex); + + for (unsigned mi=0; mi make_mana(const mvlc::CrateConfig &crateConfig, +std::map +make_module_info_by_type(const nlohmann::json &jModuleDataSources) +{ + // module type name -> module info json + std::map moduleInfoByType; + for (const auto &mod_: jModuleDataSources["modules"]) + moduleInfoByType[mod_["type_name"]] = mod_; + return moduleInfoByType; +} + +std::vector> +match_modules(const mvlc::CrateConfig &crateConfig, + const std::map &moduleInfoByType) +{ + std::vector> moduleDataSources; + for (const auto &event: crateConfig.stacks) + { + std::vector eventModuleDataSources; + for (const auto &module_: event.getGroups()) + { + nlohmann::json jModule; + // match the meta data module type name against the concrete module name + for (const auto &[type_, info]: moduleInfoByType) + { + if (module_.name.find(type_) != std::string::npos) + { + spdlog::info("match: type={}, name={}", type_, module_.name); + jModule = info; + break; + } + } + + if (jModule.empty()) + { + spdlog::warn("No module info found for module name '{}'", module_.name); + } + + eventModuleDataSources.emplace_back(jModule); + } + moduleDataSources.emplace_back(eventModuleDataSources); + } + + return moduleDataSources; +} + +struct DataSourceInfo +{ + const std::string name; + const std::string filterString; + mvlc::util::FilterWithCaches filter; + + DataSourceInfo(const std::string &name_, const std::string &filterString_) + : name(name_) + , filterString(filterString_) + , filter(mvlc::util::make_filter_with_caches(filterString)) + { + } +}; + +std::vector> +make_event_ds_info(const mvlc::CrateConfig &crateConfig, + const std::vector> &moduleDataSources) +{ + std::vector> eventDsInfo; + + for (size_t eventIndex = 0; eventIndex < crateConfig.stacks.size(); ++eventIndex) + { + const auto &dataSources = moduleDataSources.at(eventIndex); + const auto &event = crateConfig.stacks.at(eventIndex); + const auto &readouts = event.getGroups(); + std::vector dsInfo; + + for (size_t moduleIndex = 0; moduleIndex < event.getGroups().size(); ++moduleIndex) + { + const auto &readout = readouts.at(moduleIndex); + const auto &ds = dataSources.at(moduleIndex); + + spdlog::info("readout.name={}, ds={}", readout.name, ds.dump()); + if (ds.contains("data_sources")) + { + for (const auto &filter: ds["data_sources"]) + { + auto name = + fmt::format("{}.{}.{}", event.getName(), readout.name, filter["name"]); + dsInfo.emplace_back(DataSourceInfo(name, filter["filter"])); + } + } + } + eventDsInfo.emplace_back(dsInfo); + } + + return eventDsInfo; +} + +template +T *push_offset_array(mana::Arena &arena, mana_offset_array_t &dest, size_t size) +{ + T *ptr = arena.push_t(size); + mana::set(dest.ptr, mana_custom, ptr); + dest.size_bytes = size * sizeof(T); + return ptr; +} + +template +T *push_typed_offset_array(mana::Arena &arena, mana_offset_array_t &dest, size_t size) +{ + T *ptr = arena.push_t(size); + mana::set(dest.ptr, ptr); + dest.size_bytes = size * sizeof(T); + return ptr; +} + +template size_t element_count(mana_offset_array_t &array) +{ + return array.size_bytes / sizeof(T); +} + +template mvlc::util::span get_span(mana_offset_array_t &array) +{ + auto ptr = reinterpret_cast(mana::get(array.ptr)); + auto size = element_count(array); + return {ptr, size}; +} + +std::pair +make_run_descriptor(mana::Arena &arena, const std::string &runName, + const std::vector> &eventDsInfo) +{ + auto rd = arena.push_t(); + mana::set(rd->name, arena.push_cstr(runName)); + auto eds = push_offset_array(arena, rd->events, eventDsInfo.size()); + rd->event_count = eventDsInfo.size(); + + for (const auto &eventDataSources: eventDsInfo) + { + auto ed = eds++; + auto ads = push_offset_array(arena, ed->data_arrays, + eventDataSources.size()); + ed->data_array_count = eventDataSources.size(); + + for (const auto &ds: eventDataSources) + { + auto ad = ads++; + mana::set(ad->name, arena.push_cstr(ds.name)); + ad->data_type = mana_float; + ad->size = 1; + if (auto c = get_cache_entry(ds.filter, 'A'); c) + ad->size = 1u << c->extractBits; + if (auto c = get_cache_entry(ds.filter, 'D'); c) + ad->bits = c->extractBits; + } + } + + return {rd, arena.cur_end() - reinterpret_cast(rd)}; +} + +std::pair, size_t> +make_event_storages(mana::Arena &arena, const std::vector> &eventDsInfo) +{ + auto eds = arena.push_t(eventDsInfo.size()); + + for (size_t eventIndex = 0; eventIndex < eventDsInfo.size(); ++eventIndex) + { + auto &ed = eds[eventIndex]; + auto &dsInfo = eventDsInfo[eventIndex]; + auto das = push_offset_array(arena, ed.data_arrays, dsInfo.size()); + + for (const auto &ds: dsInfo) + { + auto da = das++; + size_t size = 1; + if (auto c = get_cache_entry(ds.filter, 'A'); c) + size = 1u << c->extractBits; + push_typed_offset_array(arena, *da, size); + } + } + + return {{eds, eventDsInfo.size()}, arena.cur_end() - reinterpret_cast(eds)}; +} + +void dump(mana_run_descriptor_t *rd) +{ + auto eds = get_span(rd->events); + + spdlog::info("mana_run_descriptor @ {}, name={}, event_count={}", fmt::ptr(rd), + mana::get(rd->name), eds.size()); + + for (size_t eventIndex = 0; eventIndex < rd->event_count; ++eventIndex) + { + auto &ed = eds[eventIndex]; + spdlog::info(" event[{}]:", eventIndex); + + auto ads = get_span(ed.data_arrays); + + for (auto &ad: ads) + { + spdlog::info(" array: name={}, data_type={}, size={}, bits={}", + mana::get(ad.name), static_cast(ad.data_type), ad.size, + ad.bits); + } + } +} + +std::optional make_mana(const std::string runName, + const mvlc::CrateConfig &crateConfig, const nlohmann::json &jModuleDataSources) { try { - std::map moduleInfoByType; - for (const auto &mod_: jModuleDataSources["modules"]) - moduleInfoByType[mod_["type_name"]] = mod_; + // module type name -> module info json + auto moduleInfoByType = make_module_info_by_type(jModuleDataSources); AnalysisContext ctx; ctx.arena = std::make_unique(); + // auto arena = ctx.arena.get(); + + // eventIndex -> moduleIndex -> module info json + auto moduleDataSources = match_modules(crateConfig, moduleInfoByType); + auto eventDsInfo = make_event_ds_info(crateConfig, moduleDataSources); + auto arena = ctx.arena.get(); + auto [runDescriptor, runDescriptorSize] = make_run_descriptor(*arena, runName, eventDsInfo); + + spdlog::info( + "runDescriptor @ {}, size={}, allocations={}, capacity={}, pad_waste={}, used_size={}", + fmt::ptr(runDescriptor), runDescriptorSize, arena->allocations(), arena->capacity(), + arena->pad_waste(), arena->used()); + + if (runDescriptor) + dump(runDescriptor); + + auto [eventStorages, eventStoragesSize] = make_event_storages(*arena, eventDsInfo); + + spdlog::info( + "eventStorages @ {}, size={}, allocations={}, capacity={}, pad_waste={}, used_size={}", + fmt::ptr(&eventStorages.front()), eventStoragesSize, arena->allocations(), + arena->capacity(), arena->pad_waste(), arena->used()); + + for (size_t eventIndex = 0; eventIndex < eventStorages.size(); ++eventIndex) + { + auto &es = eventStorages[eventIndex]; + auto arrays = get_span(es.data_arrays); + spdlog::info("eventStorage: event={}, arrays={}", eventIndex, arrays.size()); + for (auto &array: arrays) + { + spdlog::info(" array @ {}, size_bytes={}, size={}", + fmt::ptr(mana::get(array.ptr)), array.size_bytes, + element_count(array)); + } + } + + ctx.runDescriptor = runDescriptor; + ctx.eventStorages = eventStorages; + ctx.runDescriptorBytes = runDescriptorSize; + ctx.eventStoragesBytes = eventStoragesSize; + return ctx; } catch (const std::exception &e) @@ -159,22 +493,6 @@ std::optional make_mana(const mvlc::CrateConfig &crateConfig, } } -void event_data_callback(AnalysisContext *ctx, int crateIndex, int eventIndex, - const mvlc::readout_parser::ModuleData *moduleDataList, - unsigned moduleCount) -{ - assert(moduleDataList); - std::cout << fmt::format("ReadoutEvent: ctx={}, crateId={}, eventIndex={}, moduleCount={}\n", - fmt::ptr(ctx), crateIndex, eventIndex, moduleCount); -} - -void system_event_callback(AnalysisContext *ctx, int crateIndex, const u32 *header, u32 size) -{ - assert(header); - std::cout << fmt::format("SystemEvent: ctx={}, crateId={}, size={}\n", fmt::ptr(ctx), - crateIndex, size); -} - size_t process_one_buffer(size_t bufferNumber, ListfileContext &listfileContext, ParserContext &parserContext, AnalysisContext &analysisContext) { @@ -211,23 +529,21 @@ int main(int argc, char *argv[]) if (!listfileContext) return 1; - auto analysisContext = make_mana(listfileContext->crateConfig, jModuleDataSources); + auto analysisContext = make_mana(filename, listfileContext->crateConfig, jModuleDataSources); if (!analysisContext) return 1; - return 42; - auto event_data = [](void *ctx, int crateIndex, int eventIndex, const mvlc::readout_parser::ModuleData *moduleDataList, unsigned moduleCount) { - event_data_callback(static_cast(ctx), crateIndex, eventIndex, - moduleDataList, moduleCount); + reinterpret_cast(ctx)->process_event_data(crateIndex, eventIndex, + moduleDataList, moduleCount); }; auto system_event = [](void *ctx, int crateIndex, const u32 *header, u32 size) - { system_event_callback(static_cast(ctx), crateIndex, header, size); }; + { reinterpret_cast(ctx)->process_system_event(crateIndex, header, size); }; auto parserContext = make_parser_context(listfileContext->crateConfig, {event_data, system_event}); @@ -241,14 +557,16 @@ int main(int argc, char *argv[]) const std::chrono::milliseconds ReportInterval(500); mvlc::util::Stopwatch sw; - auto report = - [](const mvlc::util::Stopwatch sw, size_t bufferNumber, size_t totalBytesProcessed) + auto report = [&] { - auto s = sw.get_elapsed().count() / (1000.0 * 1000.0); - auto bytesPerSecond = totalBytesProcessed / s; - auto MiBPerSecond = bytesPerSecond / (1u << 20); - std::cout << fmt::format("Processed {} buffers, {} bytes. t={} s, rate={} MiB/s\n", - bufferNumber, totalBytesProcessed, s, MiBPerSecond); + [](const mvlc::util::Stopwatch sw, size_t bufferNumber, size_t totalBytesProcessed) + { + auto s = sw.get_elapsed().count() / (1000.0 * 1000.0); + auto bytesPerSecond = totalBytesProcessed / s; + auto MiBPerSecond = bytesPerSecond / (1u << 20); + std::cout << fmt::format("Processed {} buffers, {} bytes. t={} s, rate={} MiB/s\n", + bufferNumber, totalBytesProcessed, s, MiBPerSecond); + }(sw, bufferNumber, totalBytesProcessed); }; do @@ -260,13 +578,13 @@ int main(int argc, char *argv[]) if (auto elapsed = sw.get_interval(); elapsed >= ReportInterval) { - report(sw, bufferNumber, totalBytesProcessed); + report(); sw.interval(); } } while (bytesProcessed > 0); - report(sw, bufferNumber, totalBytesProcessed); + report(); return 0; } diff --git a/src/tools/mana_lib.hpp b/src/tools/mana_lib.hpp new file mode 100644 index 0000000..0debee6 --- /dev/null +++ b/src/tools/mana_lib.hpp @@ -0,0 +1,68 @@ +#ifndef AAB5E4D2_A05B_4F2F_B76A_406A5A569D55 +#define AAB5E4D2_A05B_4F2F_B76A_406A5A569D55 + +#include +#include +#include "mana_replay_api.h" + +namespace mesytec::mnode::mana +{ + +inline bool is_null(const mana_offset_ptr_t &ptr) { return ptr.offset == 1; } +inline void set_raw(mana_offset_ptr_t &ptr, void *p) +{ + assert(p != reinterpret_cast(&ptr) + 1); + + if (p) + { + ptr.offset = reinterpret_cast(p) - reinterpret_cast(&ptr); + spdlog::info("set_raw: &ptr={}, p={}, offset={}", fmt::ptr(&ptr), fmt::ptr(p), ptr.offset); + } + else + { + ptr.offset = 1; + } +} + +inline void *get(mana_offset_ptr_t &ptr) +{ + if (is_null(ptr)) + return nullptr; + + return reinterpret_cast(&ptr) + ptr.offset; +} + +template T *get(mana_offset_ptr_t &ptr); // to catch unsupported types + +template T *get_(mana_offset_ptr_t &ptr, mana_data_type_t expected) +{ + if (ptr.data_type != expected) + return nullptr; + + return reinterpret_cast(get(ptr)); +} + +template <> u32 *get(mana_offset_ptr_t &ptr) { return get_(ptr, mana_uint32); } +template <> u64 *get(mana_offset_ptr_t &ptr) { return get_(ptr, mana_uint64); } +template <> s8 *get(mana_offset_ptr_t &ptr) { return get_(ptr, mana_sint8); } +template <> char *get(mana_offset_ptr_t &ptr) { return get_(ptr, mana_sint8); } +template <> float *get(mana_offset_ptr_t &ptr) { return get_(ptr, mana_float); } +template <> double *get(mana_offset_ptr_t &ptr) { return get_(ptr, mana_double); } + +inline void set(mana_offset_ptr_t &ptr, mana_data_type_t data_type, void *p) +{ + ptr.data_type = data_type; + set_raw(ptr, p); +} + +inline void set(mana_offset_ptr_t &ptr, std::nullptr_t) { set(ptr, mana_uint32, nullptr); } +inline void set(mana_offset_ptr_t &ptr, u32 *p) { set(ptr, mana_uint32, p); } +inline void set(mana_offset_ptr_t &ptr, u64 *p) { set(ptr, mana_uint64, p); } +inline void set(mana_offset_ptr_t &ptr, s8 *p) { set(ptr, mana_sint8, p); } +inline void set(mana_offset_ptr_t &ptr, char *p) { set(ptr, mana_sint8, p); } +inline void set(mana_offset_ptr_t &ptr, float *p) { set(ptr, mana_float, p); } +inline void set(mana_offset_ptr_t &ptr, double *p) { set(ptr, mana_double, p); } + +} + +#endif /* AAB5E4D2_A05B_4F2F_B76A_406A5A569D55 */ diff --git a/src/tools/mana_replay_api.h b/src/tools/mana_replay_api.h index fab9fec..5026a71 100644 --- a/src/tools/mana_replay_api.h +++ b/src/tools/mana_replay_api.h @@ -20,59 +20,53 @@ extern "C" typedef enum { - dt_uint32, - dt_float, -} data_type_t; + mana_custom, + mana_uint8, + mana_sint8, + mana_uint16, + mana_uint32, + mana_uint64, + mana_float, + mana_double, +} mana_data_type_t; typedef struct { - const char *array_name; - data_type_t data_type; - size_t array_size; - size_t valid_bits; // belongs into data_type_t -} array_descriptor_t; + mana_data_type_t data_type; + ptrdiff_t offset; +} mana_offset_ptr_t; typedef struct { - const char *module_name; - const char *module_type; - array_descriptor_t *data_sources; - size_t data_source_count; -} module_descriptor_t; + mana_offset_ptr_t ptr; + size_t size_bytes; +} mana_offset_array_t; typedef struct { - const char *event_name; - module_descriptor_t *modules; - size_t module_count; -} event_descriptor_t; - -typedef struct -{ - const char *listfile_name; - event_descriptor_t *events; - size_t event_count; -} run_descriptor_t; - -// data views - daq data - -typedef struct -{ - float *data; + mana_offset_ptr_t name; // mana_uint8 + mana_data_type_t data_type; size_t size; -} array_t; + size_t bits; +} mana_array_descriptor_t; typedef struct { - array_t *data_arrays; - size_t data_array_count; -} module_data_t; + mana_offset_array_t data_arrays; // mana_custom: mana_array_descriptor_t + size_t data_array_count; +} mana_event_descriptor_t; typedef struct { - module_data_t *modules; - size_t module_count; -} event_data_t; + mana_offset_ptr_t name; // mana_uint8 + mana_offset_array_t events; // mana_custom: mana_event_descriptor_t + size_t event_count; +} mana_run_descriptor_t; + +typedef struct +{ + mana_offset_array_t data_arrays; // mana_custom: mana_offset_array_t +} mana_event_data_t; #define MANA_DEFINE_PLUGIN_INIT(name) \ void *name() @@ -81,19 +75,33 @@ typedef struct void name(void *context) #define MANA_DEFINE_PLUGIN_BEGIN_RUN(name) \ - void name(void *context, run_descriptor_t run_descriptor) + void name(void *context, mana_run_descriptor_t *run_descriptor) #define MANA_DEFINE_PLUGIN_END_RUN(name) \ - void name(void *context, run_descriptor_t run_descriptor) + void name(void *context, mana_run_descriptor_t *run_descriptor) #define MANA_DEFINE_PLUGIN_EVENT_DATA(name) \ - void name(void *context, int eventIndex, event_data_t event_data) + void name(void *context, int eventIndex, mana_event_data_t *event_data) -typedef MANA_DEFINE_PLUGIN_BEGIN_RUN(mana_init_t); +#define MANA_DEFINE_PLUGIN_SYSTEM_EVENT(name) \ + void name(void *context, const uint32_t *data, size_t size) + +typedef MANA_DEFINE_PLUGIN_INIT(mana_init_t); typedef MANA_DEFINE_PLUGIN_SHUTDOWN(mana_shutdown_t); typedef MANA_DEFINE_PLUGIN_BEGIN_RUN(mana_begin_run_t); -typedef MANA_DEFINE_PLUGIN_BEGIN_RUN(mana_end_run_t); -typedef MANA_DEFINE_PLUGIN_EVENT_DATA(mana_event_data_t); +typedef MANA_DEFINE_PLUGIN_END_RUN(mana_end_run_t); +typedef MANA_DEFINE_PLUGIN_EVENT_DATA(mana_process_event_t); +typedef MANA_DEFINE_PLUGIN_SYSTEM_EVENT(mana_process_system_event_t); + +typedef struct +{ + mana_init_t *init; + mana_shutdown_t *shutdown; + mana_begin_run_t *begin_run; + mana_end_run_t *end_run; + mana_process_event_t *process_event; + mana_process_system_event_t *process_system_event; +} mana_plugin_t; } From c8be12c1b65481eb646a72725765de96b4c185fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20L=C3=BCke?= Date: Wed, 25 Dec 2024 05:47:38 +0100 Subject: [PATCH 19/19] more work on mana, commiting state --- src/CMakeLists.txt | 4 + src/internal/mana_analysis.h | 92 +++++++++++++++++++++++ src/internal/mana_api.h | 79 ++++++++++++++++++++ src/{tools => internal}/mana_lib.hpp | 59 ++++++++++++--- src/mana.test.cc | 3 +- src/tools/mana_auto_replay.cc | 97 ++++++------------------ src/tools/mana_replay_api.h | 108 --------------------------- 7 files changed, 247 insertions(+), 195 deletions(-) create mode 100644 src/internal/mana_analysis.h create mode 100644 src/internal/mana_api.h rename src/{tools => internal}/mana_lib.hpp (56%) delete mode 100644 src/tools/mana_replay_api.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 3a2f614..6602053 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -8,6 +8,9 @@ target_link_libraries(mesytec-mnode PUBLIC nng mnode-proto PRIVATE spdlog) target_compile_features(mesytec-mnode PRIVATE cxx_std_17) target_compile_options(mesytec-mnode PRIVATE ${MVLC_NNG_MNODE_WARN_FLAGS}) +add_library(mana INTERFACE) +target_link_libraries(mana INTERFACE nlohmann_json::nlohmann_json mesytec-mvlc) + add_subdirectory(tools) if (MNODE_BUILD_TESTS) @@ -18,4 +21,5 @@ if (MNODE_BUILD_TESTS) endfunction() add_mnode_gtest(mana) + target_link_libraries(test_mana PRIVATE mana) endif() diff --git a/src/internal/mana_analysis.h b/src/internal/mana_analysis.h new file mode 100644 index 0000000..5972b2c --- /dev/null +++ b/src/internal/mana_analysis.h @@ -0,0 +1,92 @@ +#ifndef B63F110F_BB53_46E7_AA8E_FF6BE10CAB40 +#define B63F110F_BB53_46E7_AA8E_FF6BE10CAB40 + +#include "mana_arena.h" +#include "mana_lib.hpp" +#include + +namespace mesytec::mnode::mana +{ + +struct BitFilterExtractor +{ + mvlc::util::DataFilter filter; + mvlc::util::CacheEntry fAddress; + mvlc::util::CacheEntry fValue; + mana_offset_array_t *dest; +}; + +struct ModuleDataStage +{ + mana::Arena arena; + nlohmann::json runDescriptor; + // eventindex -> list of pointers to output offset arrays + std::vector> eventArrayPointers; + // eventIndex, moduleIndex -> list of filters attached to the module. + std::vector>> dataSources; + mana_sink_t sink = {}; + void *sinkContext = nullptr; +}; + +inline ModuleDataStage make_module_data_stage(const std::string &runName, + const mvlc::CrateConfig &crateConfig, + nlohmann::json moduleDb, mana_sink_t sink, + void *sinkContext) +{ + ModuleDataStage result; + + return result; +} + +inline void module_data_stage_begin_run(ModuleDataStage &ctx) +{ + ctx.sink.begin_run(ctx.sinkContext, ctx.runDescriptor.dump().c_str()); +} + +inline void module_data_stage_end_run(ModuleDataStage &ctx) +{ + ctx.sink.end_run(ctx.sinkContext, ctx.runDescriptor.dump().c_str()); +} + +inline void +module_data_stage_process_module_data(ModuleDataStage &ctx, int eventIndex, + const mvlc::readout_parser::ModuleData *moduleDataList, + unsigned moduleCount) +{ + auto extract_module_data = + [](const mvlc::readout_parser::DataBlock &data, BitFilterExtractor &ex) + { + auto dest = get_span(*ex.dest); + + std::fill(std::begin(dest), std::end(dest), mnode::make_quiet_nan()); + + for (const u32 *word = data.data, *end = data.data + data.size; word < end; ++word) + { + if (mvlc::util::matches(ex.filter, *word)) + { + u32 address = mvlc::util::extract(ex.fAddress, *word); + u32 value = mvlc::util::extract(ex.fValue, *word); + assert(address < dest.size()); + dest[address] = value; + } + } + }; + + auto &eventSources = ctx.dataSources.at(eventIndex); + + for (unsigned mi = 0; mi < moduleCount; ++mi) + { + auto &moduleData = moduleDataList[mi]; + auto dataBlock = moduleData.hasDynamic ? dynamic_span(moduleData) : prefix_span(moduleData); + + for (auto &source: eventSources.at(mi)) + extract_module_data(dataBlock, source); + } + + // auto arrays = ctx.eventArrayPointers.at(eventIndex); + // ctx.sink.process_event(ctx.sinkContext, eventIndex, +} + +} // namespace mesytec::mnode::mana + +#endif /* B63F110F_BB53_46E7_AA8E_FF6BE10CAB40 */ diff --git a/src/internal/mana_api.h b/src/internal/mana_api.h new file mode 100644 index 0000000..ec79b70 --- /dev/null +++ b/src/internal/mana_api.h @@ -0,0 +1,79 @@ +#ifndef A51A04C1_ABD6_4DE9_B16A_49A9DA46C67E +#define A51A04C1_ABD6_4DE9_B16A_49A9DA46C67E + +#include +#include + +#ifdef __cplusplus +extern "C" +#endif +{ + + typedef enum + { + mana_custom, + mana_uint8, + mana_sint8, + mana_uint16, + mana_uint32, + mana_uint64, + mana_float, + mana_double, + } mana_data_type_t; + + typedef struct + { + mana_data_type_t data_type; + ptrdiff_t offset; + } mana_offset_ptr_t; + + typedef struct + { + mana_offset_ptr_t ptr; + size_t size_bytes; + } mana_offset_array_t; + +#define MANA_DEFINE_PLUGIN_INIT(name) \ + void *name() + +#define MANA_DEFINE_PLUGIN_SHUTDOWN(name) \ + void name(void *context) + +#define MANA_DEFINE_PLUGIN_BEGIN_RUN(name) \ + void name(void *context, const char *descriptor_json) + +#define MANA_DEFINE_PLUGIN_END_RUN(name) \ + void name(void *context, const char *descriptor_json) + +#define MANA_DEFINE_PLUGIN_EVENT_DATA(name) \ + void name(void *context, uint16_t eventIndex, const mana_offset_array_t *arrays, size_t arrayCount, size_t totalBytes) + +#define MANA_DEFINE_PLUGIN_SYSTEM_EVENT(name) \ + void name(void *context, const uint32_t *data, size_t size) + +typedef MANA_DEFINE_PLUGIN_INIT(mana_init_t); +typedef MANA_DEFINE_PLUGIN_SHUTDOWN(mana_shutdown_t); +typedef MANA_DEFINE_PLUGIN_BEGIN_RUN(mana_begin_run_t); +typedef MANA_DEFINE_PLUGIN_END_RUN(mana_end_run_t); +typedef MANA_DEFINE_PLUGIN_EVENT_DATA(mana_process_event_t); +typedef MANA_DEFINE_PLUGIN_SYSTEM_EVENT(mana_process_system_event_t); + +typedef struct +{ + mana_init_t *init; + mana_shutdown_t *shutdown; + mana_begin_run_t *begin_run; + mana_end_run_t *end_run; + mana_process_event_t *process_event; + mana_process_system_event_t *process_system_event; +} mana_sink_t; + + // event data serialization format: + // u32 event count + // u32 total size in bytes + // u16 eventIndex, u16 array descriptor count + // array descriptors + // data arrays +} + +#endif /* A51A04C1_ABD6_4DE9_B16A_49A9DA46C67E */ diff --git a/src/tools/mana_lib.hpp b/src/internal/mana_lib.hpp similarity index 56% rename from src/tools/mana_lib.hpp rename to src/internal/mana_lib.hpp index 0debee6..010317c 100644 --- a/src/tools/mana_lib.hpp +++ b/src/internal/mana_lib.hpp @@ -3,33 +3,38 @@ #include #include -#include "mana_replay_api.h" +#include +#include +#include +#include "mana_api.h" namespace mesytec::mnode::mana { -inline bool is_null(const mana_offset_ptr_t &ptr) { return ptr.offset == 1; } -inline void set_raw(mana_offset_ptr_t &ptr, void *p) +namespace detail +{ +inline void set(mana_offset_ptr_t &ptr, void *p) { assert(p != reinterpret_cast(&ptr) + 1); if (p) { ptr.offset = reinterpret_cast(p) - reinterpret_cast(&ptr); - spdlog::info("set_raw: &ptr={}, p={}, offset={}", fmt::ptr(&ptr), fmt::ptr(p), ptr.offset); + // spdlog::info("detail::set: &ptr={}, p={}, offset={}", fmt::ptr(&ptr), fmt::ptr(p), + // ptr.offset); } else { ptr.offset = 1; } } +} // namespace detail + +inline bool is_null(const mana_offset_ptr_t &ptr) { return ptr.offset == 1; } inline void *get(mana_offset_ptr_t &ptr) { - if (is_null(ptr)) - return nullptr; - - return reinterpret_cast(&ptr) + ptr.offset; + return is_null(ptr) ? nullptr : reinterpret_cast(&ptr) + ptr.offset; } template T *get(mana_offset_ptr_t &ptr); // to catch unsupported types @@ -52,17 +57,51 @@ template <> double *get(mana_offset_ptr_t &ptr) { return get_(ptr, mana_ inline void set(mana_offset_ptr_t &ptr, mana_data_type_t data_type, void *p) { ptr.data_type = data_type; - set_raw(ptr, p); + detail::set(ptr, p); } inline void set(mana_offset_ptr_t &ptr, std::nullptr_t) { set(ptr, mana_uint32, nullptr); } inline void set(mana_offset_ptr_t &ptr, u32 *p) { set(ptr, mana_uint32, p); } inline void set(mana_offset_ptr_t &ptr, u64 *p) { set(ptr, mana_uint64, p); } -inline void set(mana_offset_ptr_t &ptr, s8 *p) { set(ptr, mana_sint8, p); } +inline void set(mana_offset_ptr_t &ptr, s8 *p) { set(ptr, mana_sint8, p); } inline void set(mana_offset_ptr_t &ptr, char *p) { set(ptr, mana_sint8, p); } inline void set(mana_offset_ptr_t &ptr, float *p) { set(ptr, mana_float, p); } inline void set(mana_offset_ptr_t &ptr, double *p) { set(ptr, mana_double, p); } +template mvlc::util::span get_span(mana_offset_array_t &array) +{ + auto ptr = reinterpret_cast(get(array.ptr)); + auto size = array.size_bytes / sizeof(T); + return { ptr, size }; } +inline nlohmann::json make_array_descriptor(const std::string &name, mana_data_type_t data_type, + size_t size, size_t bits = 0) +{ + nlohmann::json j; + j["name"] = name; + j["data_type"] = data_type; + j["size"] = size; + j["bits"] = bits; + return j; +} + +inline nlohmann::json make_array_descriptor(const std::string &name, const std::string &bit_filter) +{ + auto f = mvlc::util::make_filter_with_caches(bit_filter); + size_t size = 1; + + if (auto c = mvlc::util::get_cache_entry(f, 'A')) + size = 1u << c->extractBits; + + size_t bits = 0; + + if (auto c = mvlc::util::get_cache_entry(f, 'D')) + bits = c->extractBits; + + return make_array_descriptor(name, mana_float, size, bits); +} + +} // namespace mesytec::mnode::mana + #endif /* AAB5E4D2_A05B_4F2F_B76A_406A5A569D55 */ diff --git a/src/mana.test.cc b/src/mana.test.cc index 3d67cd6..8489136 100644 --- a/src/mana.test.cc +++ b/src/mana.test.cc @@ -2,8 +2,7 @@ #include #include "internal/mana_arena.h" #include -#include "tools/mana_replay_api.h" -#include "tools/mana_lib.hpp" +#include "internal/mana_lib.hpp" using namespace mesytec::mnode; diff --git a/src/tools/mana_auto_replay.cc b/src/tools/mana_auto_replay.cc index 5eff86a..f4727fa 100644 --- a/src/tools/mana_auto_replay.cc +++ b/src/tools/mana_auto_replay.cc @@ -38,9 +38,8 @@ #include #include #include -#include "mana_replay_api.h" #include "internal/mana_arena.h" -#include "tools/mana_lib.hpp" +#include "internal/mana_lib.hpp" CMRC_DECLARE(mnode::resources); @@ -140,91 +139,32 @@ MANA_DEFINE_PLUGIN_END_RUN(mana_default_end_run) {} MANA_DEFINE_PLUGIN_EVENT_DATA(mana_default_process_event) {} MANA_DEFINE_PLUGIN_SYSTEM_EVENT(mana_default_system_event) {} -static mana_plugin_t DefaultPlugin = {.init = mana_default_init, - .shutdown = mana_default_shutdown, - .begin_run = mana_default_begin_run, - .end_run = mana_default_end_run, - .process_event = mana_default_process_event}; +static mana_sink_t DefaultPlugin = {.init = mana_default_init, + .shutdown = mana_default_shutdown, + .begin_run = mana_default_begin_run, + .end_run = mana_default_end_run, + .process_event = mana_default_process_event}; struct DataSource { mvlc::util::DataFilter filter; mvlc::util::CacheEntry fAddress; mvlc::util::CacheEntry fValue; - mvlc::util::span dest; + mana_offset_array_t *dest; }; struct AnalysisContext { std::unique_ptr arena; - mana_run_descriptor_t *runDescriptor = nullptr; - mvlc::util::span eventStorages; - std::vector>> dataSources; // eventIndex, moduleIndex, sourceIndex - mana_plugin_t outputPlugin = DefaultPlugin; + nlohmann::json runDescriptor; + std::vector> eventArrays; + std::vector>> + dataSources; // eventIndex, moduleIndex, sourceIndex + mana_sink_t outputPlugin = DefaultPlugin; void *outputPluginContext = nullptr; size_t runDescriptorBytes = 0; size_t eventStoragesBytes = 0; - - void process_module_data(const mvlc::readout_parser::DataBlock &data, DataSource &source) - { - std::fill(std::begin(source.dest), std::end(source.dest), mnode::make_quiet_nan()); - for (const u32 *word = data.data, *end = data.data + data.size; word < end; ++word) - { - if (mvlc::util::matches(source.filter, *word)) - { - u32 address = mvlc::util::extract(source.fAddress, *word); - u32 value = mvlc::util::extract(source.fValue, *word); - assert(address < source.dest.size()); - source.dest[address] = value; - } - } - } - - void process_module_data(const mvlc::readout_parser::DataBlock &data, std::vector &sources) - { - for (auto &source: sources) - { - process_module_data(data, source); - } - } - - void process_module_data(const mvlc::readout_parser::ModuleData &moduleData, - std::vector &sources) - { - mvlc::readout_parser::DataBlock data = moduleData.hasDynamic ? dynamic_span(moduleData) - : prefix_span(moduleData); - process_module_data(data, sources); - - } - - void process_event_data(int crateIndex, int eventIndex, - const mvlc::readout_parser::ModuleData *moduleDataList, - unsigned moduleCount) - { - std::cout << fmt::format( - "ReadoutEvent: ctx={}, crateId={}, eventIndex={}, moduleCount={}\n", fmt::ptr(this), - crateIndex, eventIndex, moduleCount); - - auto &eventSources = dataSources.at(eventIndex); - - for (unsigned mi=0; mi @@ -351,6 +291,7 @@ template mvlc::util::span get_span(mana_offset_array_t &array) return {ptr, size}; } +#if 0 std::pair make_run_descriptor(mana::Arena &arena, const std::string &runName, const std::vector> &eventDsInfo) @@ -429,6 +370,7 @@ void dump(mana_run_descriptor_t *rd) } } } +#endif std::optional make_mana(const std::string runName, const mvlc::CrateConfig &crateConfig, @@ -445,6 +387,7 @@ std::optional make_mana(const std::string runName, // eventIndex -> moduleIndex -> module info json auto moduleDataSources = match_modules(crateConfig, moduleInfoByType); +#if 0 auto eventDsInfo = make_event_ds_info(crateConfig, moduleDataSources); auto arena = ctx.arena.get(); @@ -483,6 +426,7 @@ std::optional make_mana(const std::string runName, ctx.eventStorages = eventStorages; ctx.runDescriptorBytes = runDescriptorSize; ctx.eventStoragesBytes = eventStoragesSize; +#endif return ctx; } @@ -538,12 +482,15 @@ int main(int argc, char *argv[]) const mvlc::readout_parser::ModuleData *moduleDataList, unsigned moduleCount) { - reinterpret_cast(ctx)->process_event_data(crateIndex, eventIndex, - moduleDataList, moduleCount); + // reinterpret_cast(ctx)->process_event_data(crateIndex, eventIndex, + // moduleDataList, + // moduleCount); }; auto system_event = [](void *ctx, int crateIndex, const u32 *header, u32 size) - { reinterpret_cast(ctx)->process_system_event(crateIndex, header, size); }; + { + // reinterpret_cast(ctx)->process_system_event(crateIndex, header, size); + }; auto parserContext = make_parser_context(listfileContext->crateConfig, {event_data, system_event}); diff --git a/src/tools/mana_replay_api.h b/src/tools/mana_replay_api.h deleted file mode 100644 index 5026a71..0000000 --- a/src/tools/mana_replay_api.h +++ /dev/null @@ -1,108 +0,0 @@ -#ifndef DA93DC95_9F70_4B58_9B6C_5E32D3811E48 -#define DA93DC95_9F70_4B58_9B6C_5E32D3811E48 - -#include -#include - -#ifdef __cplusplus -extern "C" -#endif -{ - -// descriptors - daq tree structure -// daq -> events -> modules -> data_sources -// alternative concepts: -// crate -> triggers -> modules -> data_sources -// example data sources: "amplitude", "channel_time", "timestamp" -// data is float, data sources have a size of at least 1 -// todo: add number of valid bits in the data source -// todo: rng handling? - -typedef enum -{ - mana_custom, - mana_uint8, - mana_sint8, - mana_uint16, - mana_uint32, - mana_uint64, - mana_float, - mana_double, -} mana_data_type_t; - -typedef struct -{ - mana_data_type_t data_type; - ptrdiff_t offset; -} mana_offset_ptr_t; - -typedef struct -{ - mana_offset_ptr_t ptr; - size_t size_bytes; -} mana_offset_array_t; - -typedef struct -{ - mana_offset_ptr_t name; // mana_uint8 - mana_data_type_t data_type; - size_t size; - size_t bits; -} mana_array_descriptor_t; - -typedef struct -{ - mana_offset_array_t data_arrays; // mana_custom: mana_array_descriptor_t - size_t data_array_count; -} mana_event_descriptor_t; - -typedef struct -{ - mana_offset_ptr_t name; // mana_uint8 - mana_offset_array_t events; // mana_custom: mana_event_descriptor_t - size_t event_count; -} mana_run_descriptor_t; - -typedef struct -{ - mana_offset_array_t data_arrays; // mana_custom: mana_offset_array_t -} mana_event_data_t; - -#define MANA_DEFINE_PLUGIN_INIT(name) \ - void *name() - -#define MANA_DEFINE_PLUGIN_SHUTDOWN(name) \ - void name(void *context) - -#define MANA_DEFINE_PLUGIN_BEGIN_RUN(name) \ - void name(void *context, mana_run_descriptor_t *run_descriptor) - -#define MANA_DEFINE_PLUGIN_END_RUN(name) \ - void name(void *context, mana_run_descriptor_t *run_descriptor) - -#define MANA_DEFINE_PLUGIN_EVENT_DATA(name) \ - void name(void *context, int eventIndex, mana_event_data_t *event_data) - -#define MANA_DEFINE_PLUGIN_SYSTEM_EVENT(name) \ - void name(void *context, const uint32_t *data, size_t size) - -typedef MANA_DEFINE_PLUGIN_INIT(mana_init_t); -typedef MANA_DEFINE_PLUGIN_SHUTDOWN(mana_shutdown_t); -typedef MANA_DEFINE_PLUGIN_BEGIN_RUN(mana_begin_run_t); -typedef MANA_DEFINE_PLUGIN_END_RUN(mana_end_run_t); -typedef MANA_DEFINE_PLUGIN_EVENT_DATA(mana_process_event_t); -typedef MANA_DEFINE_PLUGIN_SYSTEM_EVENT(mana_process_system_event_t); - -typedef struct -{ - mana_init_t *init; - mana_shutdown_t *shutdown; - mana_begin_run_t *begin_run; - mana_end_run_t *end_run; - mana_process_event_t *process_event; - mana_process_system_event_t *process_system_event; -} mana_plugin_t; - -} - -#endif /* DA93DC95_9F70_4B58_9B6C_5E32D3811E48 */