ngscopeclient 0.1-dev+51fbda87c
scopehal.h
Go to the documentation of this file.
1/***********************************************************************************************************************
2* *
3* libscopehal *
4* *
5* Copyright (c) 2012-2024 Andrew D. Zonenberg and contributors *
6* All rights reserved. *
7* *
8* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the *
9* following conditions are met: *
10* *
11* * Redistributions of source code must retain the above copyright notice, this list of conditions, and the *
12* following disclaimer. *
13* *
14* * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the *
15* following disclaimer in the documentation and/or other materials provided with the distribution. *
16* *
17* * Neither the name of the author nor the names of any contributors may be used to endorse or promote products *
18* derived from this software without specific prior written permission. *
19* *
20* THIS SOFTWARE IS PROVIDED BY THE AUTHORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED *
21* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL *
22* THE AUTHORS BE HELD LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES *
23* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR *
24* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT *
25* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE *
26* POSSIBILITY OF SUCH DAMAGE. *
27* *
28***********************************************************************************************************************/
29
36#ifndef scopehal_h
37#define scopehal_h
38
39#ifdef _WIN32
40
41// These must be included first, as ws2tcpip.h pulls in winsock2.h, which overrides WinSock1 features in windows.h
42#include <ws2tcpip.h>
43#include <windows.h>
44#endif
45
46#include <deque>
47#include <vector>
48#include <string>
49#include <map>
50#include <stdint.h>
51#include <chrono>
52#include <thread>
53#include <memory>
54#include <climits>
55#include <cinttypes>
56#include <set>
57#include <float.h>
58
59#include <sigc++/sigc++.h>
60
61#include <yaml-cpp/yaml.h>
62
63#include "../log/log.h"
64#include "../xptools/TimeUtil.h"
65
66#include "config.h"
67
68//Vulkan is now a mandatory dependency, so no compile time enable flag
69//(disable some warnings in Vulkan headers that we can't do anything about)
70#pragma GCC diagnostic push
71#pragma GCC diagnostic ignored "-Wshadow"
72#include <vulkan/vulkan_raii.hpp>
73#pragma GCC diagnostic pop
74
75//must be early because a lot of inline methods in headers rely on these
76#ifdef __x86_64__
77extern bool g_hasFMA;
78extern bool g_hasAvx512F;
79extern bool g_hasAvx512VL;
80extern bool g_hasAvx512DQ;
81extern bool g_hasAvx2;
82#endif
83
84//Enable flags for various features
85extern bool g_gpuFilterEnabled;
86extern bool g_gpuScopeDriverEnabled;
87extern bool g_hasShaderFloat64;
88extern bool g_hasShaderInt64;
89extern bool g_hasShaderInt16;
90extern bool g_hasShaderInt8;
91extern bool g_hasShaderAtomicFloat;
92extern bool g_hasDebugUtils;
93extern bool g_hasMemoryBudget;
94extern bool g_hasPushDescriptor;
95
96extern size_t g_maxComputeGroupCount[3];
97
98#include "Unit.h"
99#include "Bijection.h"
100#include "IDTable.h"
101
102#include "AcceleratorBuffer.h"
103#include "ComputePipeline.h"
104
105#include "SCPITransport.h"
106#include "SCPISocketTransport.h"
107#include "SCPITwinLanTransport.h"
109#include "SCPILxiTransport.h"
110#include "SCPINullTransport.h"
111#include "SCPIUARTTransport.h"
112#include "SCPIHIDTransport.h"
113#include "VICPSocketTransport.h"
114#include "SCPIDevice.h"
115#ifdef __linux
117#endif
118
119#if !defined(_WIN32) && !defined(__APPLE__)
120// TMC is only supported on Linux for now
121// https://github.com/glscopeclient/scopehal/issues/519
122#include "SCPITMCTransport.h"
123#endif
124
125#include "FlowGraphNode.h"
126#include "Instrument.h"
127#include "StreamDescriptor.h"
128
129#include "OscilloscopeChannel.h"
132#include "Trigger.h"
133
134#include "BERT.h"
135#include "BinaryDriver.h"
136#include "CommandLineDriver.h"
137#include "DigitalIOChannel.h"
138#include "DigitalInputChannel.h"
139#include "DigitalOutputChannel.h"
140#include "FunctionGenerator.h"
142#include "Load.h"
143#include "CANChannel.h"
144#include "Multimeter.h"
145#include "MultimeterChannel.h"
146#include "Oscilloscope.h"
147#include "SParameterChannel.h"
148#include "PowerSupply.h"
149#include "PowerSupplyChannel.h"
150#include "RFSignalGenerator.h"
151#include "RFSignalGeneratorChannel.h"
152#include "SCPIInstrument.h"
153#include "HIDInstrument.h"
154#include "ModbusInstrument.h"
155#include "SCPIBERT.h"
156#include "SCPIFunctionGenerator.h"
157#include "SCPILoad.h"
158#include "SCPIMiscInstrument.h"
159#include "SCPIMultimeter.h"
160#include "SCPIOscilloscope.h"
161#include "SCPIPowerSupply.h"
162#include "SCPIRFSignalGenerator.h"
163#include "SpectrometerDarkFrameChannel.h"
164#include "SCPISA.h"
165#include "SCPISDR.h"
166#include "SCPISpectrometer.h"
167#include "SCPIVNA.h"
168#include "SwitchMatrix.h"
169
170#include "SParameters.h"
171#include "TouchstoneParser.h"
172#include "IBISParser.h"
173
174#include "FilterParameter.h"
175#include "Filter.h"
176#include "ImportFilter.h"
177#include "PeakDetectionFilter.h"
178#include "SpectrumChannel.h"
180#include "SParameterFilter.h"
181
182#include "FilterGraphExecutor.h"
183
184#include "QueueManager.h"
185
186uint64_t ConvertVectorSignalToScalar(const std::vector<bool>& bits);
187
188std::string GetDefaultChannelColor(int i);
189
190std::string Trim(const std::string& str);
191std::string TrimQuotes(const std::string& str);
192std::string BaseName(const std::string& path);
193
194std::string ReadFile(const std::string& path);
195std::string ReadDataFile(const std::string& relpath);
196std::vector<uint32_t> ReadDataFileUint32(const std::string& relpath);
197std::string FindDataFile(const std::string& relpath);
198void GetTimestampOfFile(std::string path, time_t& timestamp, int64_t& fs);
199
200std::string to_string_sci(double d);
201std::string to_string_hex(uint64_t n, bool zeropad = false, int len = 0);
202
204void DriverStaticInit();
205
206bool VulkanInit(bool skipGLFW = false);
207void InitializeSearchPaths();
208void InitializePlugins();
209void DetectCPUFeatures();
210std::string GetDirOfCurrentExecutable();
211
212void ScopehalStaticCleanup();
213
214float FreqToPhase(float hz);
215
216uint64_t next_pow2(uint64_t v);
217uint64_t prev_pow2(uint64_t v);
218
219std::vector<std::string> explode(const std::string& str, char separator);
220std::string str_replace(const std::string& search, const std::string& replace, const std::string& subject);
221std::string strtolower(const std::string& s);
222
223#define FS_PER_PICOSECOND 1e3
224#define FS_PER_NANOSECOND 1e6
225#define FS_PER_MICROSECOND 1e9
226#define FS_PER_SECOND 1e15
227#define SECONDS_PER_FS 1e-15
228
229//string to size_t conversion
230#ifdef _WIN32
231#define stos(str) static_cast<size_t>(stoll(str))
232#else
233#define stos(str) static_cast<size_t>(stol(str))
234#endif
235
236extern std::vector<std::string> g_searchPaths;
237
238//Shader args for frequently used kernels
240{
241 uint32_t size;
242 float gain;
243 float offset;
244};
245
246//Vulkan global stuff
247extern vk::raii::Context g_vkContext;
248extern std::unique_ptr<vk::raii::Instance> g_vkInstance;
249extern uint8_t g_vkComputeDeviceUuid[16];
250extern uint32_t g_vkComputeDeviceDriverVer;
251extern vk::raii::PhysicalDevice* g_vkComputePhysicalDevice;
252extern std::unique_ptr<QueueManager> g_vkQueueManager;
253extern bool g_vulkanDeviceIsIntelMesa;
254extern bool g_vulkanDeviceIsAnyMesa;
255extern bool g_vulkanDeviceIsMoltenVK;
256extern uint32_t g_vkPinnedMemoryHeap;
257extern uint32_t g_vkLocalMemoryHeap;
259
260uint32_t GetComputeBlockCount(size_t numGlobal, size_t blockSize);
261
262//Validation helper for templates
263//Throws compile-time error if specialized for false since there's no implementation
264template<bool> class CompileTimeAssert;
265template<> class CompileTimeAssert<true>{};
266
267#ifdef _WIN32
268std::string NarrowPath(wchar_t* wide);
269#else
270std::string ExpandPath(const std::string& in);
271void CreateDirectory(const std::string& path);
272#endif
273
274//Checksum helpers
275uint32_t CRC32(const uint8_t* bytes, size_t start, size_t end);
276uint32_t CRC32(const std::vector<uint8_t>& bytes);
277
278uint32_t ColorFromString(const std::string& str, unsigned int alpha = 255);
279
280const char* ScopehalGetVersion();
281
282#endif
Declaration of AcceleratorBuffer.
Declaration of BERT.
Declaration of Bijection.
Helper class for binary driver: provides methods for handling binary data.
Declaration of CANChannel, CANSymbol, and CANWaveform.
Helper class for command line drivers: provides helper methods for command line based communication w...
Declaration of ComputePipeline.
Declaration of DigitalIOChannel.
Declaration of DigitalInputChannel.
Declaration of DigitalOutputChannel.
Declaration of FilterGraphExecutor.
Declaration of FilterParameter.
Declaration of Filter.
Declaration of FlowGraphNode.
Inline functions for FlowGraphNode which reference OscilloscopeChannel class.
Declaration of FunctionGeneratorChannel.
Declaration of FunctionGenerator.
Declaration of HIDInstrument.
Declaration of IBISParser, IVCurve, IBISCorner, and VTCurves.
Declaration of IDTable class.
Declaration of ImportFilter.
Declaration of Instrument.
Declaration of Load.
Declaration of ModbusInstrument.
Declaration of MultimeterChannel.
Declaration of Multimeter.
Declaration of OscilloscopeChannel.
Declaration of Oscilloscope.
Declaration of PeakDetectionFilter.
Declaration of QueueManager and QueueHandle.
Declaration of SCPIHIDTransport.
Declaration of SCPILinuxGPIBTransport.
Declaration of SCPILxiTransport.
Declaration of SCPINullTransport.
Declaration of SA.
Declaration of SCPISDR.
Declaration of SCPISocketCANTransport.
Declaration of SCPISocketTransport.
Declaration of Spectrometer.
Declaration of SCPITMCTransport.
Declaration of SCPITransport.
Declaration of SCPITwinLanTransport.
Declaration of SCPIUARTTransport.
Declaration of VNA.
Declaration of SParameterChannel.
Declaration of SParameterFilter.
Declaration of SParameterSourceFilter.
Declaration of SParameters and related classes.
Declaration of StreamDescriptor.
Inline functions for StreamDescriptor.
Declaration of SwitchMatrix.
Declaration of TouchstoneParser.
Declaration of Trigger.
Declaration of Unit.
Declaration of VICPSocketTransport.
uint32_t ColorFromString(const string &str, unsigned int alpha)
Converts a hex color code plus externally supplied default alpha value into a packed RGBA color.
Definition: Waveform.cpp:272
Definition: scopehal.h:264
bool g_hasShaderAtomicFloat
Indicates whether atomic operations on the float type are available in shaders.
Definition: VulkanInit.cpp:189
uint8_t g_vkComputeDeviceUuid[16]
UUID of g_vkComputeDevice.
Definition: VulkanInit.cpp:130
bool VulkanInit(bool skipGLFW=false)
Initialize a Vulkan context for compute.
Definition: VulkanInit.cpp:258
bool g_vulkanDeviceIsIntelMesa
Indicates that the Vulkan driver is Mesa on an Intel GPU.
Definition: VulkanInit.cpp:235
bool g_hasShaderInt64
Indicates whether the int64 type is available for use in shaders and SSBOs.
Definition: VulkanInit.cpp:171
std::unique_ptr< vk::raii::Instance > g_vkInstance
Global Vulkan instance.
Definition: VulkanInit.cpp:65
bool g_hasPushDescriptor
Indicates whether the VK_KHR_push_descriptor extension is available.
Definition: VulkanInit.cpp:207
bool g_hasMemoryBudget
Indicates whether the VK_EXT_memory_budget extension is available.
Definition: VulkanInit.cpp:201
std::unique_ptr< QueueManager > g_vkQueueManager
Allocates QueueHandle objects.
Definition: VulkanInit.cpp:106
bool g_hasShaderInt16
Indicates whether the int16 type is available for use in shaders and SSBOs.
Definition: VulkanInit.cpp:177
bool g_hasDebugUtils
Indicates whether the VK_EXT_debug_utils extension is available.
Definition: VulkanInit.cpp:195
bool g_vulkanDeviceIsMoltenVK
Indicates that the Vulkan driver is MoltenVK.
Definition: VulkanInit.cpp:247
vk::raii::Context g_vkContext
Global Vulkan context.
Definition: VulkanInit.cpp:59
bool g_hasShaderFloat64
Indicates whether the float64 type is available for use in shaders and SSBOs.
Definition: VulkanInit.cpp:165
uint32_t g_vkLocalMemoryHeap
Heap from which g_vkLocalMemoryType is allocated.
Definition: VulkanInit.cpp:154
uint32_t g_vkPinnedMemoryHeap
Heap from which g_vkPinnedMemoryType is allocated.
Definition: VulkanInit.cpp:148
size_t g_maxComputeGroupCount[3]
Maximum size of a Vulkan dispatch group for compute shaders, in each axis.
Definition: VulkanInit.cpp:226
bool g_vulkanDeviceIsAnyMesa
Indicates that the Vulkan driver is Mesa on any GPU.
Definition: VulkanInit.cpp:241
vk::raii::PhysicalDevice * g_vkComputePhysicalDevice
Physical device for g_vkComputeDevice.
Definition: VulkanInit.cpp:142
bool g_hasShaderInt8
Indicates whether the int8 type is available for use in shaders and SSBOs.
Definition: VulkanInit.cpp:183
bool g_vulkanDeviceHasUnifiedMemory
Indicates whether the Vulkan device is unified memory.
Definition: VulkanInit.cpp:220
uint32_t g_vkComputeDeviceDriverVer
Driver version of g_vkComputeDevice.
Definition: VulkanInit.cpp:136
string str_replace(const string &search, const string &replace, const string &subject)
Replaces all occurrences of the search string with "replace" in the given string.
Definition: scopehal.cpp:891
string TrimQuotes(const string &str)
Removes quotes from the start and end of a string.
Definition: scopehal.cpp:521
vector< uint32_t > ReadDataFileUint32(const string &relpath)
Locates and returns the contents of a data file as a std::vector<uint32_t>
Definition: scopehal.cpp:785
uint64_t ConvertVectorSignalToScalar(const vector< bool > &bits)
Converts a vector bus signal into a scalar (up to 64 bits wide)
Definition: scopehal.cpp:320
vector< string > explode(const string &str, char separator)
Splits a string up into an array separated by delimiters.
Definition: scopehal.cpp:857
string strtolower(const string &s)
Converts a string to lower case.
Definition: scopehal.cpp:880
string Trim(const string &str)
Removes whitespace from the start and end of a string.
Definition: scopehal.cpp:489
string ReadFile(const string &path)
Returns the contents of a file.
Definition: scopehal.cpp:631
string FindDataFile(const string &relpath)
Locates a data file.
Definition: scopehal.cpp:817
string ReadDataFile(const string &relpath)
Locates and returns the contents of a data file as a std::string.
Definition: scopehal.cpp:752
void TransportStaticInit()
Static initialization for SCPI transports.
Definition: scopehal.cpp:148
void InitializePlugins()
Initialize all plugins.
Definition: scopehal.cpp:331
const char * ScopehalGetVersion()
Returns the library version string (Semantic Version formatted)
Definition: scopehal.cpp:1008
uint32_t CRC32(const uint8_t *bytes, size_t start, size_t end)
Calculates a CRC32 checksum using the standard Ethernet polynomial.
Definition: scopehal.cpp:977
uint64_t prev_pow2(uint64_t v)
Rounds a 64-bit integer down to the next power of 2.
Definition: scopehal.cpp:618
bool g_gpuScopeDriverEnabled
True if scope drivers can use GPU acceleration.
Definition: scopehal.cpp:136
std::string GetDirOfCurrentExecutable()
Gets the path to the directory containing the current executable.
Definition: scopehal.cpp:663
std::string to_string_sci(double d)
Like std::to_string, but output in scientific notation.
Definition: scopehal.cpp:566
uint64_t next_pow2(uint64_t v)
Rounds a 64-bit integer up to the next power of 2.
Definition: scopehal.cpp:594
std::string to_string_hex(uint64_t n, bool zeropad=false, int len=0)
Like std::to_string, but output in hex.
Definition: scopehal.cpp:576
void DetectCPUFeatures()
Static initialization for CPU feature flags.
Definition: scopehal.cpp:178
void DriverStaticInit()
Static initialization for instrument drivers.
Definition: scopehal.cpp:220
bool g_gpuFilterEnabled
True if filters can use GPU acceleration.
Definition: scopehal.cpp:133
float FreqToPhase(float hz)
Converts a frequency in Hz to a phase velocity in rad/sec.
Definition: scopehal.cpp:558
Definition: scopehal.h:240