-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathGettingStarted.html
More file actions
400 lines (338 loc) · 44.5 KB
/
GettingStarted.html
File metadata and controls
400 lines (338 loc) · 44.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
<!DOCTYPE html>
<html lang='en-US' xml:lang='en-US'>
<head><title>3 Getting Started</title>
<meta charset='utf-8' />
<meta content='TeX4ht (https://tug.org/tex4ht/)' name='generator' />
<meta content='width=device-width,initial-scale=1' name='viewport' />
<link href='ngscopeclient-manual.css' rel='stylesheet' type='text/css' />
<meta content='ngscopeclient-manual.tex' name='src' />
<script>window.MathJax = { tex: { tags: "ams", }, }; </script>
<script async='async' id='MathJax-script' src='https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml-full.js' type='text/javascript'></script>
</head><body>
<!-- l. 1 --><div class='crosslinks'><p class='noindent'>[<a href='Tutorials.html'>next</a>] [<a href='LegalNotices.html'>prev</a>] [<a href='LegalNotices.html#tailLegalNotices.html'>prev-tail</a>] [<a href='#tailGettingStarted.html'>tail</a>] [<a href='ngscopeclient-manual.html#GettingStarted.html'>up</a>] </p></div>
<h2 class='chapterHead' id='getting-started'><span class='titlemark'>Chapter 3</span><br /><a id='x5-180003'></a>Getting Started</h2>
<h3 class='sectionHead' id='host-system-requirements'><span class='titlemark'>3.1 </span> <a id='x5-190003.1'></a>Host System Requirements</h3>
<!-- l. 5 --><p class='noindent'>The majority of development is performed on Linux operating systems (primarily Debian) so this is the
most well tested platform, however Windows and Mac OS are also supported.
</p><!-- l. 8 --><p class='indent'> Any 64-bit Intel or AMD processor, or Apple Silicon Mac, should be able to run ngscopeclient. If AVX2
and/or AVX512F support is present ngscopeclient will use special optimized versions of some signal
processing functions, however neither instruction set is required. Other (non Apple Silicon) ARM64
platforms may work if a compatible GPU is available, but have not been tested. We don’t actively test on
32-bit platforms due to the significant RAM requirements, but we won’t stop you from trying and would
love to hear if you get it working.
</p><!-- l. 14 --><p class='indent'> A mouse with scroll wheel, or touchpad with scroll gesture support, is mandatory to enable
full use of the UI. We may explore alternative input methods for some UI elements in the
future.
</p><!-- l. 17 --><p class='indent'> Any GPU with Vulkan support should be able to run ngscopeclient, however Vulkan 1.2 will deliver
better performance. The minimum supported GPUs are: </p>
<ul class='itemize1'>
<li class='itemize'>NVIDIA: Maxwell architecture (GeForce GTX 700 series and newer, February 2014)
</li>
<li class='itemize'>AMD: GCN based (Radeon HD 7000 and newer, January 2012)
</li>
<li class='itemize'>Intel: Iris Plus 540 or HD Graphics 520 (Skylake, August 2015)
</li>
<li class='itemize'>Apple: all Apple Silicon devices (M1 and newer). Newer Intel devices with Metal support
should work but have not been tested.</li></ul>
<!-- l. 27 --><p class='indent'> Note that many virtual machine graphics stacks (e.g. VMWare) do not provide Vulkan unless a PCIe
passthrough GPU is being used.
</p><!-- l. 30 --><p class='indent'> The minimum RAM requirement to launch ngscopeclient is relatively small; however, actual memory
consumption is heavily dependent on workload and can easily reach into the tens of gigabytes when doing
complex analysis on many channels with deep history.
</p><!-- l. 34 --><p class='indent'> Typical RAM consumption examples: </p>
<ul class='itemize1'>
<li class='itemize'>Default configuration with demo scope (4 channels 100K points, 10 waveforms of history, no
analysis): 250 MB
</li>
<li class='itemize'>4M point live streaming with 10 waveforms of history, eye pattern, 8B/10B decode, and jitter
histogram: 650 MB
</li>
<li class='itemize'>Single 512M point waveform, no analysis or history: 2.1 GB
</li>
<li class='itemize'>512M point P/N channel waveforms with CDR and eye pattern, no history: 8.3 GB</li></ul>
<!-- l. 42 --><p class='indent'> Large amounts of GPU RAM are required for working with deep waveforms, especially if you intend
to perform complex analysis on them. Analog waveforms are stored in 32-bit floating point
format internally, so a single 256 megapoint waveform will consume 1GB of GPU memory.
Intermediate results in multi-step filter pipelines require GPU memory as well, even if not
displayed.
</p><!-- l. 47 --><p class='indent'> The maximum supported waveform size depends on your Vulkan implementation but is typically \(2^32\) bytes
(4 GB). This translates to one gigapoint analog or four gigapoints digital.
</p><!-- l. 50 --><p class='noindent'>
</p>
<h3 class='sectionHead' id='instrument-support'><span class='titlemark'>3.2 </span> <a id='x5-200003.2'></a>Instrument Support</h3>
<!-- l. 52 --><p class='noindent'>ngscopeclient uses the libscopehal library to communicate with instruments, so any libscopehal-compatible
hardware should work with ngscopeclient. See the <a href='OscilloscopeDrivers.html#oscilloscope-drivers'>Oscilloscope Drivers</a> section for more details on which
hardware is supported and how to configure specific drivers.
</p><!-- l. 56 --><p class='noindent'>
</p>
<h3 class='sectionHead' id='installation'><span class='titlemark'>3.3 </span> <a id='x5-210003.3'></a>Installation</h3>
<!-- l. 58 --><p class='noindent'>
</p>
<h4 class='subsectionHead' id='official-releases'><span class='titlemark'>3.3.1 </span> <a id='x5-220003.3.1'></a>Official Releases</h4>
<!-- l. 60 --><p class='noindent'>Prebuilt binary packages are available for some of our supported platforms.
</p><!-- l. 62 --><p class='indent'> The latest released binaries can be downloaded from GitHub at
<a class='url' href='https://github.com/ngscopeclient/scopehal-apps/releases'><span class='t1-zi4r-0-x-x-109'>https://github.com/ngscopeclient/scopehal-apps/releases</span></a>.
</p><!-- l. 64 --><p class='noindent'>
</p>
<h4 class='subsectionHead' id='development-builds'><span class='titlemark'>3.3.2 </span> <a id='x5-230003.3.2'></a>Development Builds</h4>
<!-- l. 66 --><p class='noindent'>If you are feeling adventurous and want to try bleeding-edge code, or are testing a fix at a developer’s
request, packages for a limited set of platforms (currently Ubuntu 20.04, 22.04, 24.04, Arch, Fedora,
Debian oldstable, Debian stable, MacOS, and Windows) are automatically built each commit as part of
the GitHub CI pipeline. Unlike release packages, CI builds are not signed so you may encounter security
warnings on some platforms when installing them.
</p><!-- l. 71 --><p class='indent'> To access development packages, log into GitHub (sorry, development binaries are not
available to anonymous users - this is on GitHub’s end and not under our control) and go to
<a class='url' href='https://github.com/ngscopeclient/scopehal-apps/actions'><span class='t1-zi4r-0-x-x-109'>https://github.com/ngscopeclient/scopehal-apps/actions</span></a>. Select build-ubuntu or build-windows as
appropriate, click the commit you wish to test, and download the appropriate .msi, .rpm, .dmg, or .deb
package.
</p><!-- l. 76 --><p class='noindent'>
</p>
<h3 class='sectionHead' id='compilation'><span class='titlemark'>3.4 </span> <a id='x5-240003.4'></a>Compilation</h3>
<!-- l. 78 --><p class='noindent'>ngscopeclient can be compiled on Linux, macOS, and Windows. While the compilation process is generally
similar, various steps differ among platform and distro.
</p><!-- l. 81 --><p class='noindent'>
</p>
<h4 class='subsectionHead' id='linux'><span class='titlemark'>3.4.1 </span> <a id='x5-250003.4.1'></a>Linux</h4>
<!-- l. 83 --><p class='noindent'>
</p><dl class='enumerate'><dt class='enumerate'>
1. </dt><dd class='enumerate'>Install dependencies.
<!-- l. 86 --><p class='noindent'>
</p>
<h5 class='subsubsectionHead' id='debian'><a id='x5-26000'></a>Debian</h5>
<!-- l. 88 --><p class='noindent'>Basic requirements: </p><!-- l. 89 -->
<pre class='lstlisting' id='listing-1'><span class='label'><a id='x5-26001r1'></a></span><span style='color:#000000'><span class='t1-zi4r-0-'>sudo</span></span><span style='color:#000000'> <span class='t1-zi4r-0-'>apt-get </span><span class='t1-zi4r-0-'>install </span><span class='t1-zi4r-0-'>build-essential </span><span class='t1-zi4r-0-'>git </span><span class='t1-zi4r-0-'>cmake </span><span class='t1-zi4r-0-'>pkgconf </span><span class='t1-zi4r-0-'>libgtk-3-dev </span><span class='t1-zi4r-0-'>libsigc++-2.0-dev </span><span class='t1-zi4r-0-'>libyaml-cpp-dev </span><span class='t1-zi4r-0-'>catch2 </span><span class='t1-zi4r-0-'>libglfw3-dev </span><span class='t1-zi4r-0-'>curl </span><span class='t1-zi4r-0-'>xzip </span><span class='t1-zi4r-0-'>libhidapi-dev </span><span class='t1-zi4r-0-'>lsb-release </span><span class='t1-zi4r-0-'>dpkg-dev </span><span class='t1-zi4r-0-'>file</span></span></pre>
<!-- l. 93 --><p class='noindent'>On Debian bookworm and later, you can use system-provided Vulkan packages. Skip this if you
choose to use the upstream Vulkan SDK instead: </p><!-- l. 94 -->
<pre class='lstlisting' id='listing-2'><span class='label'><a id='x5-26002r1'></a></span><span style='color:#000000'><span class='t1-zi4r-0-'>sudo</span></span><span style='color:#000000'> <span class='t1-zi4r-0-'>apt-get </span><span class='t1-zi4r-0-'>install </span><span class='t1-zi4r-0-'>libvulkan-dev </span><span class='t1-zi4r-0-'>glslang-dev </span><span class='t1-zi4r-0-'>glslang-tools </span><span class='t1-zi4r-0-'>spirv-tools </span><span class='t1-zi4r-0-'>glslc</span></span></pre>
<!-- l. 98 --><p class='noindent'>To build the LXI component (needed if you have LXI- or VXI-11-based instruments):
</p><!-- l. 99 -->
<pre class='lstlisting' id='listing-3'><span class='label'><a id='x5-26003r1'></a></span><span style='color:#000000'><span class='t1-zi4r-0-'>sudo</span></span><span style='color:#000000'> <span class='t1-zi4r-0-'>apt </span><span class='t1-zi4r-0-'>install </span><span class='t1-zi4r-0-'>liblxi-dev </span><span class='t1-zi4r-0-'>libtirpc-dev</span></span></pre>
<!-- l. 103 --><p class='noindent'>To build the documentation, you will also need LaTeX packages: </p><!-- l. 104 -->
<pre class='lstlisting' id='listing-4'><span class='label'><a id='x5-26004r1'></a></span><span style='color:#000000'><span class='t1-zi4r-0-'>sudo</span></span><span style='color:#000000'> <span class='t1-zi4r-0-'>apt </span><span class='t1-zi4r-0-'>install </span><span class='t1-zi4r-0-'>texlive </span><span class='t1-zi4r-0-'>texlive-fonts-extra </span><span class='t1-zi4r-0-'>texlive-extra-utils</span></span></pre>
<!-- l. 108 --><p class='noindent'>
</p>
<h5 class='subsubsectionHead' id='ubuntu'><a id='x5-27000'></a>Ubuntu</h5>
<!-- l. 110 --><p class='noindent'>Basic requirements: </p><!-- l. 111 -->
<pre class='lstlisting' id='listing-5'><span class='label'><a id='x5-27001r1'></a></span><span style='color:#000000'><span class='t1-zi4r-0-'>sudo</span></span><span style='color:#000000'> <span class='t1-zi4r-0-'>apt </span><span class='t1-zi4r-0-'>install </span><span class='t1-zi4r-0-'>build-essential </span><span class='t1-zi4r-0-'>git </span><span class='t1-zi4r-0-'>cmake </span><span class='t1-zi4r-0-'>pkgconf </span><span class='t1-zi4r-0-'>libgtk-3-dev </span><span class='t1-zi4r-0-'>libsigc++-2.0-dev </span><span class='t1-zi4r-0-'>libyaml-cpp-dev </span><span class='t1-zi4r-0-'>catch2 </span><span class='t1-zi4r-0-'>libglfw3-dev </span><span class='t1-zi4r-0-'>curl </span><span class='t1-zi4r-0-'>xzip </span><span class='t1-zi4r-0-'>libhidapi-dev </span><span class='t1-zi4r-0-'>lsb-release</span></span></pre>
<!-- l. 115 --><p class='noindent'>On Ubuntu 22.10 and earlier (including 20.04 and 22.04), you will need to use the Vulkan SDK.
Instructions for installing this are in a later step. On Ubuntu 23.04 and later, you can instead use
system-provided Vulkan packages: </p><!-- l. 118 -->
<pre class='lstlisting' id='listing-6'><span class='label'><a id='x5-27002r1'></a></span><span style='color:#000000'><span class='t1-zi4r-0-'>sudo</span></span><span style='color:#000000'> <span class='t1-zi4r-0-'>apt-get </span><span class='t1-zi4r-0-'>install </span><span class='t1-zi4r-0-'>libvulkan-dev </span><span class='t1-zi4r-0-'>glslang-dev </span><span class='t1-zi4r-0-'>glslang-tools </span><span class='t1-zi4r-0-'>spirv-tools </span><span class='t1-zi4r-0-'>glslc</span></span></pre>
<!-- l. 123 --><p class='noindent'>To build the LXI component (needed if you have LXI- or VXI-11-based instruments):
</p><!-- l. 124 -->
<pre class='lstlisting' id='listing-7'><span class='label'><a id='x5-27003r1'></a></span><span style='color:#000000'><span class='t1-zi4r-0-'>sudo</span></span><span style='color:#000000'> <span class='t1-zi4r-0-'>apt </span><span class='t1-zi4r-0-'>install </span><span class='t1-zi4r-0-'>liblxi-dev </span><span class='t1-zi4r-0-'>libtirpc-dev</span></span></pre>
<!-- l. 128 --><p class='noindent'>To build the documentation, you will also need LaTeX packages: </p><!-- l. 129 -->
<pre class='lstlisting' id='listing-8'><span class='label'><a id='x5-27004r1'></a></span><span style='color:#000000'><span class='t1-zi4r-0-'>sudo</span></span><span style='color:#000000'> <span class='t1-zi4r-0-'>apt </span><span class='t1-zi4r-0-'>install </span><span class='t1-zi4r-0-'>texlive </span><span class='t1-zi4r-0-'>texlive-fonts-extra </span><span class='t1-zi4r-0-'>texlive-extra-utils</span></span></pre>
<!-- l. 134 --><p class='noindent'>
</p>
<h5 class='subsubsectionHead' id='fedora'><a id='x5-28000'></a>Fedora</h5>
<!-- l. 135 --><p class='noindent'>Basic requirements: </p><!-- l. 136 -->
<pre class='lstlisting' id='listing-9'><span class='label'><a id='x5-28001r1'></a></span><span style='color:#000000'><span class='t1-zi4r-0-'>sudo</span></span><span style='color:#000000'> <span class='t1-zi4r-0-'>dnf </span><span class='t1-zi4r-0-'>install </span><span class='t1-zi4r-0-'>git </span><span class='t1-zi4r-0-'>gcc </span><span class='t1-zi4r-0-'>g++ </span><span class='t1-zi4r-0-'>cmake </span><span class='t1-zi4r-0-'>make </span><span class='t1-zi4r-0-'>pkgconf </span><span class='t1-zi4r-0-'>gtk3-devel </span><span class='t1-zi4r-0-'>libsigc++30-devel </span><span class='t1-zi4r-0-'>yaml-cpp-devel </span><span class='t1-zi4r-0-'>catch-devel </span><span class='t1-zi4r-0-'>glfw-devel </span><span class='t1-zi4r-0-'>hidapi-devel </span><span class='t1-zi4r-0-'>lsb-release</span></span></pre>
<!-- l. 140 --><p class='noindent'>System-provided Vulkan packages. Skip these if you choose to use the Vulkan SDK instead:
</p><!-- l. 141 -->
<pre class='lstlisting' id='listing-10'><span class='label'><a id='x5-28002r1'></a></span><span style='color:#000000'><span class='t1-zi4r-0-'>sudo</span></span><span style='color:#000000'> <span class='t1-zi4r-0-'>dnf </span><span class='t1-zi4r-0-'>install </span><span class='t1-zi4r-0-'>vulkan-headers </span><span class='t1-zi4r-0-'>vulkan-loader-devel </span><span class='t1-zi4r-0-'>glslang-devel </span><span class='t1-zi4r-0-'>glslc </span><span class='t1-zi4r-0-'>libshaderc-devel </span><span class='t1-zi4r-0-'>spirv-tools-devel</span></span></pre>
<!-- l. 145 --><p class='noindent'>To build the LXI component (needed if you have LXI- or VXI-11-based instruments):
</p><!-- l. 146 -->
<pre class='lstlisting' id='listing-11'><span class='label'><a id='x5-28003r1'></a></span><span style='color:#000000'><span class='t1-zi4r-0-'>sudo</span></span><span style='color:#000000'> <span class='t1-zi4r-0-'>dnf </span><span class='t1-zi4r-0-'>install </span><span class='t1-zi4r-0-'>liblxi-devel </span><span class='t1-zi4r-0-'>libtirpc-devel</span></span></pre>
<!-- l. 150 --><p class='noindent'>To build the documentation, you will also need LaTeX packages: </p><!-- l. 151 -->
<pre class='lstlisting' id='listing-12'><span class='label'><a id='x5-28004r1'></a></span><span style='color:#000000'><span class='t1-zi4r-0-'>sudo</span></span><span style='color:#000000'> <span class='t1-zi4r-0-'>dnf </span><span class='t1-zi4r-0-'>install </span><span class='t1-zi4r-0-'>texlive</span></span></pre>
<!-- l. 155 --><p class='noindent'>
</p>
<h5 class='subsubsectionHead' id='alpine-linux'><a id='x5-29000'></a>Alpine Linux</h5>
<!-- l. 157 --><p class='noindent'>As Alpine Linux uses musl libc, you will need to use system-provided Vulkan packages, and not the
Vulkan SDK. </p><!-- l. 158 -->
<pre class='lstlisting' id='listing-13'><span class='label'><a id='x5-29001r1'></a></span><span style='color:#000000'><span class='t1-zi4r-0-'>apk</span></span><span style='color:#000000'> <span class='t1-zi4r-0-'>add </span><span class='t1-zi4r-0-'>git </span><span class='t1-zi4r-0-'>gcc </span><span class='t1-zi4r-0-'>g++ </span><span class='t1-zi4r-0-'>cmake </span><span class='t1-zi4r-0-'>make </span><span class='t1-zi4r-0-'>pkgconf </span><span class='t1-zi4r-0-'>gtk+3.0-dev </span><span class='t1-zi4r-0-'>libsigc++-dev </span><span class='t1-zi4r-0-'>yaml-cpp-dev </span><span class='t1-zi4r-0-'>catch2-3 </span><span class='t1-zi4r-0-'>vulkan-loader-dev </span><span class='t1-zi4r-0-'>glslang-dev </span><span class='t1-zi4r-0-'>glslang-static </span><span class='t1-zi4r-0-'>glfw-dev </span><span class='t1-zi4r-0-'>shaderc-dev </span><span class='t1-zi4r-0-'>spirv-tools-dev </span><span class='t1-zi4r-0-'>libhidapi-dev </span><span class='t1-zi4r-0-'>lsb-release-minimal</span></span></pre>
<!-- l. 162 --><p class='noindent'>If you are using an older stable release (such as CentOS 7), you may need to install some
dependencies from source.
</p></dd><dt class='enumerate'>
2. </dt><dd class='enumerate'>Install Vulkan SDK:
<!-- l. 166 --><p class='noindent'>In many cases, you can install the SDK components from distro-provided repositories, which is
covered above. When possible, this is preferred over installing the Vulkan SDK. If you choose not to,
or are running a Linux distro that does not provide these packages (for instance, Debian Bullseye,
Ubuntu versions prior to 23.04, or other stable distros), the following instructions cover installing and
loading the Vulkan SDK.
</p><!-- l. 171 --><p class='noindent'>The latest tested SDK at the time of documentation update is version 1.3.275.0. Newer SDKs are
supported, but breaking changes sometimes take place. If you are using a newer SDK and run into
problems, please file a bug report.
</p><!-- l. 175 --><p class='noindent'>Alternatively, to use the tarball packaged SDK, download and unpack the tarball. <a href='https://vulkan.lunarg.com/sdk/home'>You can manually
download the SDK</a>, or do the following: </p><!-- l. 177 -->
<pre class='lstlisting' id='listing-14'><span class='label'><a id='x5-29003r1'></a></span><span style='color:#000000'><span class='t1-zi4b-0-'>cd</span></span><span style='color:#000000'> <span class='t1-zi4r-0-'>~</span>
</span><span class='label'><a id='x5-29004r2'></a></span><span style='color:#000000'><span class='t1-zi4r-0-'>mkdir</span></span><span style='color:#000000'> <span class='t1-zi4r-0-'>VulkanSDK</span>
</span><span class='label'><a id='x5-29005r3'></a></span><span style='color:#000000'><span class='t1-zi4b-0-'>cd</span></span><span style='color:#000000'> <span class='t1-zi4r-0-'>VulkanSDK</span>
</span><span class='label'><a id='x5-29006r4'></a></span><span style='color:#000000'><span class='t1-zi4r-0-'>curl</span></span><span style='color:#000000'> <span class='t1-zi4r-0-'>-LO </span><span class='ts1-zi4r-'>'</span><span class='t1-zi4r-0-'>https://vulkan.lunarg.com/sdk/download/1.3.275.0/linux/vulkansdk-linux-x86_64-1.3.275.0.tar.xz</span><span class='ts1-zi4r-'>'</span>
</span><span class='label'><a id='x5-29007r5'></a></span><span style='color:#000000'><span class='t1-zi4r-0-'>tar</span></span><span style='color:#000000'> <span class='t1-zi4r-0-'>xfv </span><span class='t1-zi4r-0-'>vulkansdk-linux-x86_64-1.3.275.0.tar.xz</span></span></pre>
<!-- l. 185 --><p class='noindent'>And then source the ‘setup-env.sh‘ file: </p><!-- l. 186 -->
<pre class='lstlisting' id='listing-15'><span class='label'><a id='x5-29008r1'></a></span><span style='color:#000000'><span class='t1-zi4r-0-'>source</span></span><span style='color:#000000'> <span class='t1-zi4r-0-'>"$HOME/VulkanSDK/1.3.275.0/setup-env.sh"</span></span></pre>
<!-- l. 190 --><p class='noindent'>When using the tarball-packaged SDK, you will need to source the ‘setup-env.sh‘ file any time you
want to compile or run ngscopeclient. For convenience, you can add this to your ‘.bash_profile‘ or
equivalent: </p><!-- l. 192 -->
<pre class='lstlisting' id='listing-16'><span class='label'><a id='x5-29009r1'></a></span><span style='color:#000000'><span class='t1-zi4b-0-'>echo</span></span><span style='color:#000000'> <span class='t1-zi4r-0-'>"source </span><span class='t1-zi4r-0-'>\"$HOME/VulkanSDK/1.3.275.0/setup-</span><span class='t1-zi4b-0-'>env</span><span class='t1-zi4r-0-'>.sh\"" </span><span class='t1-zi4r-0-'>>> </span><span class='t1-zi4r-0-'>~/.bash_profile</span></span></pre>
</dd><dt class='enumerate'>
3. </dt><dd class='enumerate'>Build scopehal and scopehal-apps:
<!-- l. 198 -->
<pre class='lstlisting' id='listing-17'><span class='label'><a id='x5-29011r1'></a></span><span style='color:#000000'><span class='t1-zi4b-0-'>cd</span></span><span style='color:#000000'> <span class='t1-zi4r-0-'>~</span>
</span><span class='label'><a id='x5-29012r2'></a></span><span style='color:#000000'><span class='t1-zi4r-0-'>git</span></span><span style='color:#000000'> <span class='t1-zi4r-0-'>clone </span><span class='t1-zi4r-0-'>--recursive </span><span class='t1-zi4r-0-'>https://github.com/ngscopeclient/scopehal-apps.git</span>
</span><span class='label'><a id='x5-29013r3'></a></span><span style='color:#000000'><span class='t1-zi4b-0-'>cd</span></span><span style='color:#000000'> <span class='t1-zi4r-0-'>scopehal-apps</span>
</span><span class='label'><a id='x5-29014r4'></a></span><span style='color:#000000'><span class='t1-zi4r-0-'>mkdir</span></span><span style='color:#000000'> <span class='t1-zi4r-0-'>build</span>
</span><span class='label'><a id='x5-29015r5'></a></span><span style='color:#000000'><span class='t1-zi4b-0-'>cd</span></span><span style='color:#000000'> <span class='t1-zi4r-0-'>build</span>
</span><span class='label'><a id='x5-29016r6'></a></span><span style='color:#000000'><span class='t1-zi4r-0-'>cmake</span></span><span style='color:#000000'> <span class='t1-zi4r-0-'>.. </span><span class='t1-zi4r-0-'>-DCMAKE_BUILD_TYPE=Release </span><span class='t1-zi4r-0-'>-DBUILD_TESTING=OFF</span>
</span><span class='label'><a id='x5-29017r7'></a></span><span style='color:#000000'><span class='t1-zi4r-0-'>make</span></span><span style='color:#000000'> <span class='t1-zi4r-0-'>-j4</span></span></pre>
</dd></dl>
<!-- l. 210 --><p class='noindent'>
</p>
<h4 class='subsectionHead' id='macos'><span class='titlemark'>3.4.2 </span> <a id='x5-300003.4.2'></a>macOS</h4>
<!-- l. 212 --><p class='noindent'>
</p><dl class='enumerate'><dt class='enumerate'>
1. </dt><dd class='enumerate'>Install dependencies.
<!-- l. 215 --><p class='noindent'>You will need Xcode (either from the App Store or the Apple developer site); after installing,
run it once for it to install system components. This provides gcc, g++, make, and similar
required packages.
</p><!-- l. 218 --><p class='noindent'>With Homebrew (<a href='https://brew.sh'>brew.sh</a>):
</p></dd><dt class='enumerate'>
2. </dt><dd class='enumerate'>Basic requirements: <!-- l. 221 -->
<pre class='lstlisting' id='listing-18'><span class='label'><a id='x5-30003r1'></a></span><span style='color:#000000'><span class='t1-zi4r-0-'>brew</span></span><span style='color:#000000'> <span class='t1-zi4r-0-'>install </span><span class='t1-zi4r-0-'>pkg-config </span><span class='t1-zi4r-0-'>libsigc++ </span><span class='t1-zi4r-0-'>glfw </span><span class='t1-zi4r-0-'>cmake </span><span class='t1-zi4r-0-'>yaml-cpp </span><span class='t1-zi4r-0-'>catch2 </span><span class='t1-zi4r-0-'>libomp </span><span class='t1-zi4r-0-'>hidapi </span><span class='t1-zi4r-0-'>libpng</span></span></pre>
</dd><dt class='enumerate'>
3. </dt><dd class='enumerate'>Vulkan SDK components (skip if using the Vulkan SDK): <!-- l. 226 -->
<pre class='lstlisting' id='listing-19'><span class='label'><a id='x5-30005r1'></a></span><span style='color:#000000'><span class='t1-zi4r-0-'>brew</span></span><span style='color:#000000'> <span class='t1-zi4r-0-'>install </span><span class='t1-zi4r-0-'>vulkan-headers </span><span class='t1-zi4r-0-'>vulkan-loader </span><span class='t1-zi4r-0-'>glslang </span><span class='t1-zi4r-0-'>shaderc </span><span class='t1-zi4r-0-'>spirv-tools </span><span class='t1-zi4r-0-'>molten-vk</span></span></pre>
</dd><dt class='enumerate'>
4. </dt><dd class='enumerate'>Alternatively, install the Vulkan SDK:
<!-- l. 232 --><p class='noindent'><a href='https://vulkan.lunarg.com/sdk/home'>Download and install the Vulkan SDK.</a>. The latest tested SDK at the time of documentation update
is version 1.3.275.0. Newer SDKs are supported, but breaking changes sometimes take place. If you
are using a newer SDK and run into problems, please file a bug report.
</p><!-- l. 237 --><p class='noindent'>And then source the ‘setup-env.sh‘ file: </p><!-- l. 238 -->
<pre class='lstlisting' id='listing-20'><span class='label'><a id='x5-30007r1'></a></span><span style='color:#000000'><span class='t1-zi4r-0-'>source</span></span><span style='color:#000000'> <span class='t1-zi4r-0-'>"$HOME/VulkanSDK/1.3.275.0/setup-env.sh"</span></span></pre>
<!-- l. 242 --><p class='noindent'>When using the SDK, you will need to source the ‘setup-env.sh‘ file any time you want to compile or
run ngscopeclient. For convenience, you can add this to your ‘.zprofile‘ or equivalent:
</p><!-- l. 244 -->
<pre class='lstlisting' id='listing-21'><span class='label'><a id='x5-30008r1'></a></span><span style='color:#000000'><span class='t1-zi4b-0-'>echo</span></span><span style='color:#000000'> <span class='t1-zi4r-0-'>"source </span><span class='t1-zi4r-0-'>\"$HOME/VulkanSDK/1.3.275.0/setup-</span><span class='t1-zi4b-0-'>env</span><span class='t1-zi4r-0-'>.sh\"" </span><span class='t1-zi4r-0-'>>> </span><span class='t1-zi4r-0-'>~/.zprofile</span></span></pre>
</dd><dt class='enumerate'>
5. </dt><dd class='enumerate'>Build scopehal and scopehal-apps:
<!-- l. 250 -->
<pre class='lstlisting' id='listing-22'><span class='label'><a id='x5-30010r1'></a></span><span style='color:#000000'><span class='t1-zi4b-0-'>cd</span></span><span style='color:#000000'> <span class='t1-zi4r-0-'>~</span>
</span><span class='label'><a id='x5-30011r2'></a></span><span style='color:#000000'><span class='t1-zi4r-0-'>git</span></span><span style='color:#000000'> <span class='t1-zi4r-0-'>clone </span><span class='t1-zi4r-0-'>--recursive </span><span class='t1-zi4r-0-'>https://github.com/ngscopeclient/scopehal-apps.git</span>
</span><span class='label'><a id='x5-30012r3'></a></span><span style='color:#000000'><span class='t1-zi4b-0-'>cd</span></span><span style='color:#000000'> <span class='t1-zi4r-0-'>scopehal-apps</span>
</span><span class='label'><a id='x5-30013r4'></a></span><span style='color:#000000'><span class='t1-zi4r-0-'>mkdir</span></span><span style='color:#000000'> <span class='t1-zi4r-0-'>build</span>
</span><span class='label'><a id='x5-30014r5'></a></span><span style='color:#000000'><span class='t1-zi4b-0-'>cd</span></span><span style='color:#000000'> <span class='t1-zi4r-0-'>build</span>
</span><span class='label'><a id='x5-30015r6'></a></span><span style='color:#000000'><span class='t1-zi4r-0-'>cmake</span></span><span style='color:#000000'> <span class='t1-zi4r-0-'>.. </span><span class='t1-zi4r-0-'>-DCMAKE_BUILD_TYPE=Release </span><span class='t1-zi4r-0-'>-DCMAKE_PREFIX_PATH="$(brew </span><span class='t1-zi4r-0-'>--prefix);$(brew </span><span class='t1-zi4r-0-'>--prefix)/opt/libomp"</span>
</span><span class='label'><a id='x5-30016r7'></a></span><span style='color:#000000'><span class='t1-zi4r-0-'>make</span></span><span style='color:#000000'> <span class='t1-zi4r-0-'>-j4</span></span></pre>
</dd></dl>
<!-- l. 262 --><p class='noindent'>
</p>
<h4 class='subsectionHead' id='windows'><span class='titlemark'>3.4.3 </span> <a id='x5-310003.4.3'></a>Windows</h4>
<!-- l. 264 --><p class='noindent'>On Windows, we make use of the MSYS2 development environment, which gives us access to the
MingGW-w64 toolchain. Since this toolchain allows ngscopeclient to be compiled as a native Windows
application, the project might be run outside of MSYS2.
</p><!-- l. 268 --><p class='noindent'>
</p>
<h5 class='subsubsectionHead' id='building-from-source'><a id='x5-32000'></a>Building from source</h5>
<!-- l. 271 --><p class='noindent'>
</p><dl class='enumerate'><dt class='enumerate'>
1. </dt><dd class='enumerate'>Download and install MSYS2. You can download it from <a href='https://www.msys2.org/'>msys2.org</a> or
<a href='https://github.com/msys2/msys2-installer/releases'>github.com/msys2/msys2-installer/releases</a><br class='newline' />
<!-- l. 276 --><p class='noindent'>The following steps can be done in any MSYS-provided shell.
</p></dd><dt class='enumerate'>
2. </dt><dd class='enumerate'>Install git and the toolchain: <!-- l. 281 -->
<pre class='lstlisting' id='listing-23'><span class='label'><a id='x5-32003r1'></a></span><span style='color:#000000'><span class='t1-zi4r-0-'>pacman</span></span><span style='color:#000000'> <span class='t1-zi4r-0-'>-S </span><span class='t1-zi4r-0-'>git </span><span class='t1-zi4r-0-'>wget </span><span class='t1-zi4r-0-'>mingw-w64-ucrt-x86_64-cmake </span><span class='t1-zi4r-0-'>mingw-w64-ucrt-x86_64-toolchain</span></span></pre>
</dd><dt class='enumerate'>
3. </dt><dd class='enumerate'>Install general dependencies: <!-- l. 286 -->
<pre class='lstlisting' id='listing-24'><span class='label'><a id='x5-32005r1'></a></span><span style='color:#000000'><span class='t1-zi4r-0-'>pacman</span></span><span style='color:#000000'> <span class='t1-zi4r-0-'>-S </span><span class='t1-zi4r-0-'>mingw-w64-ucrt-x86_64-libsigc++ </span><span class='t1-zi4r-0-'>mingw-w64-ucrt-x86_64-yaml-cpp </span><span class='t1-zi4r-0-'>mingw-w64-ucrt-x86_64-glfw </span><span class='t1-zi4r-0-'>mingw-w64-ucrt-x86_64-catch </span><span class='t1-zi4r-0-'>mingw-w64-ucrt-x86_64-hidapi </span><span class='t1-zi4r-0-'>mingw-w64-ucrt-x86_64-libpng</span></span></pre>
</dd><dt class='enumerate'>
4. </dt><dd class='enumerate'>Install Vulkan dependencies: <!-- l. 291 -->
<pre class='lstlisting' id='listing-25'><span class='label'><a id='x5-32007r1'></a></span><span style='color:#000000'><span class='t1-zi4r-0-'>pacman</span></span><span style='color:#000000'> <span class='t1-zi4r-0-'>-S </span><span class='t1-zi4r-0-'>mingw-w64-ucrt-x86_64-vulkan-headers </span><span class='t1-zi4r-0-'>mingw-w64-ucrt-x86_64-vulkan-loader </span><span class='t1-zi4r-0-'>mingw-w64-ucrt-x86_64-shaderc </span><span class='t1-zi4r-0-'>mingw-w64-ucrt-x86_64-glslang </span><span class='t1-zi4r-0-'>mingw-w64-ucrt-x86_64-spirv-tools</span></span></pre>
</dd><dt class='enumerate'>
5. </dt><dd class='enumerate'>Install FFTW (required for a few unit tests): <!-- l. 296 -->
<pre class='lstlisting' id='listing-26'><span class='label'><a id='x5-32009r1'></a></span><span style='color:#000000'><span class='t1-zi4r-0-'>pacman</span></span><span style='color:#000000'> <span class='t1-zi4r-0-'>-S </span><span class='t1-zi4r-0-'>mingw-w64-ucrt-x86_64-fftw</span></span></pre>
</dd><dt class='enumerate'>
6. </dt><dd class='enumerate'>Check out the code
<!-- l. 302 -->
<pre class='lstlisting' id='listing-27'><span class='label'><a id='x5-32011r1'></a></span><span style='color:#000000'><span class='t1-zi4b-0-'>cd</span></span><span style='color:#000000'> <span class='t1-zi4r-0-'>~</span>
</span><span class='label'><a id='x5-32012r2'></a></span><span style='color:#000000'><span class='t1-zi4r-0-'>git</span></span><span style='color:#000000'> <span class='t1-zi4r-0-'>clone </span><span class='t1-zi4r-0-'>--recursive </span><span class='t1-zi4r-0-'>https://github.com/ngscopeclient/scopehal-apps</span></span></pre>
<!-- l. 307 --><p class='noindent'>All following steps are to be done in a UCRT64 shell.
</p></dd><dt class='enumerate'>
7. </dt><dd class='enumerate'>Build manually: <!-- l. 310 -->
<pre class='lstlisting' id='listing-28'><span class='label'><a id='x5-32014r1'></a></span><span style='color:#000000'><span class='t1-zi4b-0-'>cd</span></span><span style='color:#000000'> <span class='t1-zi4r-0-'>scopehal-apps</span>
</span><span class='label'><a id='x5-32015r2'></a></span><span style='color:#000000'><span class='t1-zi4r-0-'>mkdir</span></span><span style='color:#000000'> <span class='t1-zi4r-0-'>build</span>
</span><span class='label'><a id='x5-32016r3'></a></span><span style='color:#000000'><span class='t1-zi4b-0-'>cd</span></span><span style='color:#000000'> <span class='t1-zi4r-0-'>build</span>
</span><span class='label'><a id='x5-32017r4'></a></span><span style='color:#000000'><span class='t1-zi4r-0-'>cmake</span></span><span style='color:#000000'> <span class='t1-zi4r-0-'>..</span>
</span><span class='label'><a id='x5-32018r5'></a></span><span style='color:#000000'><span class='t1-zi4r-0-'>ninja</span></span><span style='color:#000000'> <span class='t1-zi4r-0-'>-j4</span></span></pre>
</dd><dt class='enumerate'>
8. </dt><dd class='enumerate'>Optional, to build MSI installer:
<!-- l. 320 --><p class='noindent'>Download and install WiX Toolset.<br class='newline' />You can download it from <a href='https://github.com/wixtoolset/wix3/releases'>https://github.com/wixtoolset/wix3/releases</a><br class='newline' />If you install it to the path <span class='t1-zi4r-0-x-x-109'>"C:\Program Files (x86)\WiX Toolset v3.14" </span>run the following cmake
command instead of <span class='t1-zi4r-0-x-x-109'>cmake .. </span>mentioned earlier:
</p>
<!-- l. 324 -->
<pre class='lstlisting' id='listing-29'><span class='label'><a id='x5-32020r1'></a></span><span style='color:#000000'><span class='t1-zi4r-0-'>cmake</span></span><span style='color:#000000'> <span class='t1-zi4r-0-'>.. </span><span class='t1-zi4r-0-'>-DWIXPATH="C:\Program </span><span class='t1-zi4r-0-'>Files </span><span class='t1-zi4r-0-'>(x86)\WiX </span><span class='t1-zi4r-0-'>Toolset </span><span class='t1-zi4r-0-'>v3.14\bin"</span></span></pre>
<!-- l. 328 --><p class='noindent'><span class='t1-zi4r-0-x-x-109'>ninja </span>compilation will now generate the installer after binaries.
</p></dd><dt class='enumerate'>
9. </dt><dd class='enumerate'>Run scopehal and scopehal-apps:
<!-- l. 373 --><p class='noindent'>Building scopehal and scopehal-apps with MSYS2 will install required dependencies
in MSYS2’s libpath, so locally compiled builds of ngscopeclient have to be launched
from a MSYS2 shell (use MSI installer to generate a standalone package including these
libraries).
</p><!-- l. 377 --><p class='noindent'>The binaries can be found in the build directory, such as ngscopeclient in
$HOME/scopehal-apps/build/src/ngscopeclient.
</p><!-- l. 379 --><p class='noindent'>Use the following commands to run ngscopeclient: </p><!-- l. 380 -->
<pre class='lstlisting' id='listing-30'><span class='label'><a id='x5-32022r1'></a></span><span style='color:#000000'><span class='t1-zi4b-0-'>cd</span></span><span style='color:#000000'> <span class='t1-zi4r-0-'>src/ngscopeclient/</span>
</span><span class='label'><a id='x5-32023r2'></a></span><span style='color:#000000'><span class='t1-zi4r-0-'>.</span></span><span style='color:#000000'><span class='t1-zi4r-0-'>/</span></span><span style='color:#000000'><span class='t1-zi4r-0-'>ngscopeclient</span></span><span style='color:#000000'><span class='t1-zi4r-0-'>.</span></span><span style='color:#000000'><span class='t1-zi4r-0-'>exe</span></span></pre>
<!-- l. 385 --><p class='noindent'>Or with some debug options: </p><!-- l. 386 -->
<pre class='lstlisting' id='listing-31'><span class='label'><a id='x5-32024r1'></a></span><span style='color:#000000'><span class='t1-zi4r-0-'>.</span></span><span style='color:#000000'><span class='t1-zi4r-0-'>/</span></span><span style='color:#000000'><span class='t1-zi4r-0-'>ngscopeclient</span></span><span style='color:#000000'><span class='t1-zi4r-0-'>.</span></span><span style='color:#000000'><span class='t1-zi4r-0-'>exe</span></span><span style='color:#000000'> <span class='t1-zi4r-0-'>--debug </span><span class='t1-zi4r-0-'>--trace </span><span class='t1-zi4r-0-'>SCPISocketTransport</span></span></pre>
</dd></dl>
<!-- l. 394 --><p class='noindent'>
</p>
<h3 class='sectionHead' id='running-ngscopeclient'><span class='titlemark'>3.5 </span> <a id='x5-330003.5'></a>Running ngscopeclient</h3>
<!-- l. 396 --><p class='noindent'>When running ngscopeclient with no arguments, an empty session (Fig. 3.1) is created. To perform useful
work, you can: </p>
<ul class='itemize1'>
<li class='itemize'>Open a saved session and reconnect to the instruments (<span class='t1-zi4r-0-x-x-109'>File | Open Online</span>)
</li>
<li class='itemize'>Open a saved session without reconnecting to the instruments (<span class='t1-zi4r-0-x-x-109'>File | Open Offline</span>)
</li>
<li class='itemize'>Open a recently used session (<span class='t1-zi4r-0-x-x-109'>File | Recent Files</span>)
</li>
<li class='itemize'>Import waveforms from a third party file format(<span class='t1-zi4r-0-x-x-109'>Add | Import</span>)
</li>
<li class='itemize'>Connect to an instrument (<span class='t1-zi4r-0-x-x-109'>Add | Oscilloscope</span>, <span class='t1-zi4r-0-x-x-109'>Add | Multimeter</span>, etc.)
</li>
<li class='itemize'>Generate a synthetic waveform (<span class='t1-zi4r-0-x-x-109'>Add | Generate</span>)</li></ul>
<figure class='figure' id='-empty-ngscopeclient-session'>
<a id='x5-33001r1'></a>
<!-- l. 409 --><p class='noindent'><img alt='PIC' height='600' src='ng-images/empty-window.png' width='1027' />
</p>
<figcaption class='caption'><span class='id'>Figure 3.1: </span><span class='content'>Empty ngscopeclient session</span></figcaption><!-- tex4ht:label?: x5-33001r1 -->
</figure>
<h4 class='subsectionHead' id='general-arguments'><span class='titlemark'>3.5.1 </span> <a id='x5-340003.5.1'></a>General arguments</h4>
<ul class='itemize1'>
<li class='itemize'><span class='t1-zi4r-0-x-x-109'>--version</span><br class='newline' />Print the application version and exit.
</li>
<li class='itemize'><span class='t1-zi4r-0-x-x-109'>--help</span>, <span class='t1-zi4r-0-x-x-109'>-h</span><br class='newline' />Print a brief description of the available command line arguments and exit.
</li></ul>
<!-- l. 450 --><p class='noindent'>
</p>
<h4 class='subsectionHead' id='console-verbosity-arguments'><span class='titlemark'>3.5.2 </span> <a id='x5-350003.5.2'></a>Console verbosity arguments</h4>
<!-- l. 452 --><p class='noindent'>ngscopeclient takes standard liblogtools arguments for controlling console debug verbosity.
</p><!-- l. 454 --><p class='indent'> If no verbosity level is specified, the default is “notice" (3). (We suggest using <span class='t1-zi4r-0-x-x-109'>--debug </span>for routine use
until the v1.0 release to aid in troubleshooting.)
</p>
<ul class='itemize1'>
<li class='itemize'><span class='t1-zi4r-0-x-x-109'>--debug</span><br class='newline' />Sets the verbosity level to “debug" (5).
</li>
<li class='itemize'><span class='t1-zi4r-0-x-x-109'>-l [file]</span>, <span class='t1-zi4r-0-x-x-109'>--logfile [file]</span><br class='newline' />Writes a copy of all log messages to <span class='t1-zi4r-0-x-x-109'>file</span>. This is preferred over simply redirecting output
with pipes, as console escape sequences are stripped from the file log output.
</li>
<li class='itemize'><span class='t1-zi4r-0-x-x-109'>-L [file]</span>, <span class='t1-zi4r-0-x-x-109'>--logfile-lines [file]</span><br class='newline' />Same as <span class='t1-zi4r-0-x-x-109'>--logfile </span>except line buffering is turned on.
</li>
<li class='itemize'><span class='t1-zi4r-0-x-x-109'>-q</span>, <span class='t1-zi4r-0-x-x-109'>--quiet</span><br class='newline' />Reduces the verbosity level by one. Can be specified more than once to lower verbosity by
several steps.
</li>
<li class='itemize'><span class='t1-zi4r-0-x-x-109'>--trace [class]</span>, <span class='t1-zi4r-0-x-x-109'>--trace [class::function] </span><br class='newline' />Enables extra debug output from the class <span class='t1-zi4r-0-x-x-109'>class </span>or the function <span class='t1-zi4r-0-x-x-109'>class::function</span>. Has no
effect unless <span class='t1-zi4r-0-x-x-109'>--debug </span>is also specified.
</li>
<li class='itemize'><span class='t1-zi4r-0-x-x-109'>--stdout-only</span><br class='newline' />Sends all logging output to stdout. By default, error (level 1) and warning (level 2) messages
go to stderr.
</li>
<li class='itemize'><span class='t1-zi4r-0-x-x-109'>--verbose</span><br class='newline' />Sets the verbosity level to “verbose" (4).
</li></ul>
<!-- l. 1 --><div class='crosslinks'><p class='noindent'>[<a href='Tutorials.html'>next</a>] [<a href='LegalNotices.html'>prev</a>] [<a href='LegalNotices.html#tailLegalNotices.html'>prev-tail</a>] [<a href='GettingStarted.html'>front</a>] [<a href='ngscopeclient-manual.html#GettingStarted.html'>up</a>] </p></div>
<!-- l. 1 --><p class='indent'> <a id='tailGettingStarted.html'></a> </p>
</body>
</html>