ngscopeclient v0.1-rc1
scopehal.h
Go to the documentation of this file.
1/***********************************************************************************************************************
2* *
3* libscopehal *
4* *
5* Copyright (c) 2012-2025 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#include <shared_mutex>
59
60#include <sigc++/sigc++.h>
61
62#include <yaml-cpp/yaml.h>
63
64#include "../log/log.h"
65#include "../xptools/TimeUtil.h"
66
67#include "config.h"
68
69//Vulkan is now a mandatory dependency, so no compile time enable flag
70//(disable some warnings in Vulkan headers that we can't do anything about)
71#pragma GCC diagnostic push
72#pragma GCC diagnostic ignored "-Wshadow"
73#include <vulkan/vulkan_raii.hpp>
74#pragma GCC diagnostic pop
75
76//must be early because a lot of inline methods in headers rely on these
77#ifdef __x86_64__
78extern bool g_hasFMA;
79extern bool g_hasAvx512F;
80extern bool g_hasAvx512VL;
81extern bool g_hasAvx512DQ;
82extern bool g_hasAvx2;
83#endif
84
85//Helper for absolute value of an int64_t
86#ifdef _WIN32
87#define i64abs(x) llabs(x)
88#else
89#define i64abs(x) labs(x)
90#endif
91
92//Enable flags for various features
93extern bool g_gpuFilterEnabled;
94extern bool g_hasShaderFloat64;
95extern bool g_hasShaderInt64;
96extern bool g_hasShaderInt16;
97extern bool g_hasShaderInt8;
98extern bool g_hasShaderAtomicFloat;
99extern bool g_hasDebugUtils;
100extern bool g_hasMemoryBudget;
101extern bool g_hasPushDescriptor;
102
103extern size_t g_maxComputeGroupCount[3];
104
106{
107 uint32_t end;
108 uint32_t filterlen;
109};
110
111uint32_t GetComputeBlockCount(size_t numGlobal, size_t blockSize);
112
113#include "Unit.h"
114#include "Bijection.h"
115#include "IDTable.h"
116
117#include "AcceleratorBuffer.h"
118#include "ComputePipeline.h"
119
120#include "SCPITransport.h"
121#include "SCPISocketTransport.h"
122#include "SCPITwinLanTransport.h"
123#include "SCPILxiTransport.h"
124#include "SCPINullTransport.h"
125#include "SCPIUARTTransport.h"
126#include "SCPIHIDTransport.h"
127#include "VICPSocketTransport.h"
128#include "SCPIDevice.h"
129#ifdef __linux
131#endif
132
133#if !defined(_WIN32) && !defined(__APPLE__)
134// TMC is only supported on Linux for now
135// https://github.com/glscopeclient/scopehal/issues/519
136#include "SCPITMCTransport.h"
137#endif
138
139#include "FlowGraphNode.h"
140#include "Instrument.h"
141#include "StreamDescriptor.h"
142
143#include "OscilloscopeChannel.h"
146#include "Trigger.h"
147
148#include "BERT.h"
149#include "BinaryDriver.h"
150#include "CommandLineDriver.h"
151#include "DigitalIOChannel.h"
152#include "DigitalInputChannel.h"
153#include "DigitalOutputChannel.h"
154#include "FunctionGenerator.h"
156#include "Load.h"
157#include "CANChannel.h"
158#include "Multimeter.h"
159#include "MultimeterChannel.h"
160#include "Oscilloscope.h"
161#include "SParameterChannel.h"
162#include "PowerSupply.h"
163#include "PowerSupplyChannel.h"
164#include "RFSignalGenerator.h"
165#include "RFSignalGeneratorChannel.h"
166#include "SCPIInstrument.h"
167#include "HIDInstrument.h"
168#include "ModbusInstrument.h"
169#include "SCPIBERT.h"
170#include "SCPIFunctionGenerator.h"
171#include "SCPILoad.h"
172#include "SCPIMiscInstrument.h"
173#include "SCPIMultimeter.h"
174#include "SCPIOscilloscope.h"
175#include "SCPIPowerSupply.h"
176#include "SCPIRFSignalGenerator.h"
177#include "SpectrometerDarkFrameChannel.h"
178#include "SCPISA.h"
179#include "SCPISDR.h"
180#include "SCPISpectrometer.h"
181#include "SCPIVNA.h"
182#include "SwitchMatrix.h"
183
184#include "SParameters.h"
185#include "TouchstoneParser.h"
186#include "IBISParser.h"
187
188#include "FilterParameter.h"
189#include "Filter.h"
190#include "ImportFilter.h"
191#include "PeakDetectionFilter.h"
192#include "SpectrumChannel.h"
194#include "SParameterFilter.h"
195
196#include "FilterGraphExecutor.h"
197
198#include "QueueManager.h"
199
200uint64_t ConvertVectorSignalToScalar(const std::vector<bool>& bits);
201
202std::string GetDefaultChannelColor(int i);
203
204std::string Trim(const std::string& str);
205std::string TrimQuotes(const std::string& str);
206std::string BaseName(const std::string& path);
207
208std::string ReadFile(const std::string& path);
209std::string ReadDataFile(const std::string& relpath);
210std::vector<uint32_t> ReadDataFileUint32(const std::string& relpath);
211std::string FindDataFile(const std::string& relpath);
212void GetTimestampOfFile(std::string path, time_t& timestamp, int64_t& fs);
213
214std::string to_string_sci(double d);
215std::string to_string_hex(uint64_t n, bool zeropad = false, int len = 0);
216
218void DriverStaticInit();
219
220bool VulkanInit(bool skipGLFW = false);
221void InitializeSearchPaths();
222void InitializePlugins();
223void DetectCPUFeatures();
224std::string GetDirOfCurrentExecutable();
225
226void ScopehalStaticCleanup();
227
228float FreqToPhase(float hz);
229
230uint64_t next_pow2(uint64_t v);
231uint64_t prev_pow2(uint64_t v);
232
233std::vector<std::string> explode(const std::string& str, char separator);
234std::string str_replace(const std::string& search, const std::string& replace, const std::string& subject);
235std::string strtolower(const std::string& s);
236
237#define FS_PER_PICOSECOND 1e3
238#define FS_PER_NANOSECOND 1e6
239#define FS_PER_MICROSECOND 1e9
240#define FS_PER_SECOND 1e15
241#define SECONDS_PER_FS 1e-15
242
243//string to size_t conversion
244#ifdef _WIN32
245#define stos(str) static_cast<size_t>(stoll(str))
246#else
247#define stos(str) static_cast<size_t>(stol(str))
248#endif
249
250extern std::vector<std::string> g_searchPaths;
251
252//Shader args for frequently used kernels
254{
255 uint32_t size;
256 float gain;
257 float offset;
258};
259
260//Vulkan global stuff
261extern vk::raii::Context g_vkContext;
262extern std::unique_ptr<vk::raii::Instance> g_vkInstance;
263extern uint8_t g_vkComputeDeviceUuid[16];
264extern uint32_t g_vkComputeDeviceDriverVer;
265extern vk::raii::PhysicalDevice* g_vkComputePhysicalDevice;
266extern std::unique_ptr<QueueManager> g_vkQueueManager;
267extern bool g_vulkanDeviceIsIntelMesa;
268extern bool g_vulkanDeviceIsAnyMesa;
269extern bool g_vulkanDeviceIsMoltenVK;
270extern uint32_t g_vkPinnedMemoryHeap;
271extern uint32_t g_vkLocalMemoryHeap;
273extern std::shared_mutex g_vulkanActivityMutex;;
274
275//Validation helper for templates
276//Throws compile-time error if specialized for false since there's no implementation
277template<bool> class CompileTimeAssert;
278template<> class CompileTimeAssert<true>{};
279
280#ifdef _WIN32
281std::string NarrowPath(wchar_t* wide);
282#else
283std::string ExpandPath(const std::string& in);
284void CreateDirectory(const std::string& path);
285#endif
286
287//Checksum helpers
288uint32_t CRC32(const uint8_t* bytes, size_t start, size_t end);
289uint32_t CRC32(const std::vector<uint8_t>& bytes);
290
291uint32_t ColorFromString(const std::string& str, unsigned int alpha = 255);
292
293const char* ScopehalGetVersion();
294
295#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 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:277
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:906
string TrimQuotes(const string &str)
Removes quotes from the start and end of a string.
Definition: scopehal.cpp:539
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:800
uint64_t ConvertVectorSignalToScalar(const vector< bool > &bits)
Converts a vector bus signal into a scalar (up to 64 bits wide)
Definition: scopehal.cpp:331
vector< string > explode(const string &str, char separator)
Splits a string up into an array separated by delimiters.
Definition: scopehal.cpp:872
string strtolower(const string &s)
Converts a string to lower case.
Definition: scopehal.cpp:895
string Trim(const string &str)
Removes whitespace from the start and end of a string.
Definition: scopehal.cpp:507
string ReadFile(const string &path)
Returns the contents of a file.
Definition: scopehal.cpp:649
string FindDataFile(const string &relpath)
Locates a data file.
Definition: scopehal.cpp:832
string ReadDataFile(const string &relpath)
Locates and returns the contents of a data file as a std::string.
Definition: scopehal.cpp:767
void TransportStaticInit()
Static initialization for SCPI transports.
Definition: scopehal.cpp:159
void InitializePlugins()
Initialize all plugins.
Definition: scopehal.cpp:342
const char * ScopehalGetVersion()
Returns the library version string (Semantic Version formatted)
Definition: scopehal.cpp:1023
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:992
uint64_t prev_pow2(uint64_t v)
Rounds a 64-bit integer down to the next power of 2.
Definition: scopehal.cpp:636
std::string GetDirOfCurrentExecutable()
Gets the path to the directory containing the current executable.
Definition: scopehal.cpp:681
std::string to_string_sci(double d)
Like std::to_string, but output in scientific notation.
Definition: scopehal.cpp:584
uint64_t next_pow2(uint64_t v)
Rounds a 64-bit integer up to the next power of 2.
Definition: scopehal.cpp:612
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:594
void DetectCPUFeatures()
Static initialization for CPU feature flags.
Definition: scopehal.cpp:186
void DriverStaticInit()
Static initialization for instrument drivers.
Definition: scopehal.cpp:228
bool g_gpuFilterEnabled
True if filters can use GPU acceleration.
Definition: scopehal.cpp:140
std::shared_mutex g_vulkanActivityMutex
Mutex for controlling access to background Vulkan activity.
Definition: scopehal.cpp:154
float FreqToPhase(float hz)
Converts a frequency in Hz to a phase velocity in rad/sec.
Definition: scopehal.cpp:576
Definition: scopehal.h:254
Definition: scopehal.h:106