ngscopeclient 0.1-dev+51fbda87c
MultiLaneBERT.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
37#ifndef MultiLaneBERT_h
38#define MultiLaneBERT_h
39
45 : public virtual SCPIBERT
46 , public virtual SCPIDevice
47{
48public:
49 MultiLaneBERT(SCPITransport* transport);
50 virtual ~MultiLaneBERT();
51
52 virtual void PostCtorInit() override;
53
54 virtual bool AcquireData() override;
55
56 //Device information
57 virtual uint32_t GetInstrumentTypesForChannel(size_t i) const override;
58
59 //TX pattern generator configuration
60 virtual Pattern GetTxPattern(size_t i) override;
61 virtual void SetTxPattern(size_t i, Pattern pattern) override;
62 virtual std::vector<Pattern> GetAvailableTxPatterns(size_t i) override;
63 virtual bool IsCustomPatternPerChannel() override;
64 virtual size_t GetCustomPatternLength() override;
65 virtual void SetGlobalCustomPattern(uint64_t pattern) override;
66 virtual uint64_t GetGlobalCustomPattern() override;
67
68 //TX driver configuration
69 virtual bool GetTxInvert(size_t i) override;
70 virtual void SetTxInvert(size_t i, bool invert) override;
71 virtual std::vector<float> GetAvailableTxDriveStrengths(size_t i) override;
72 virtual float GetTxDriveStrength(size_t i) override;
73 virtual void SetTxDriveStrength(size_t i, float drive) override;
74 virtual void SetTxEnable(size_t i, bool enable) override;
75 virtual bool GetTxEnable(size_t i) override;
76 virtual float GetTxPreCursor(size_t i) override;
77 virtual void SetTxPreCursor(size_t i, float precursor) override;
78 virtual float GetTxPostCursor(size_t i) override;
79 virtual void SetTxPostCursor(size_t i, float postcursor) override;
80
81 //RX input buffer configuration
82 virtual bool GetRxInvert(size_t i) override;
83 virtual void SetRxInvert(size_t i, bool invert) override;
84 virtual bool HasRxCTLE() override;
85 virtual std::vector<float> GetRxCTLEGainSteps() override;
86 virtual size_t GetRxCTLEGainStep(size_t i) override;
87 virtual void SetRxCTLEGainStep(size_t i, size_t step) override;
88
89 //RX pattern checker configuration
90 virtual Pattern GetRxPattern(size_t i) override;
91 virtual void SetRxPattern(size_t i, Pattern pattern) override;
92 virtual std::vector<Pattern> GetAvailableRxPatterns(size_t i) override;
93
94 //RX data readout
95 virtual bool GetRxCdrLockState(size_t i) override;
96 virtual void MeasureHBathtub(size_t i) override;
97 virtual void MeasureEye(size_t i) override;
98 virtual void SetBERIntegrationLength(int64_t uis) override;
99 virtual int64_t GetBERIntegrationLength() override;
100 virtual void SetBERSamplingPoint(size_t i, int64_t dx, float dy) override;
101 virtual void GetBERSamplingPoint(size_t i, int64_t& dx, float& dy) override;
102
103 //Reference clock output
104 virtual size_t GetRefclkOutMux() override;
105 virtual void SetRefclkOutMux(size_t i) override;
106 virtual std::vector<std::string> GetRefclkOutMuxNames() override;
107 virtual int64_t GetRefclkOutFrequency() override;
108 virtual int64_t GetRefclkInFrequency() override;
109 virtual bool HasRefclkIn() override;
110 virtual bool HasRefclkOut() override;
111
112 //Timebase
113 virtual bool IsDataRatePerChannel() override;
114 virtual int64_t GetDataRate(size_t i) override;
115 virtual void SetDataRate(size_t i, int64_t rate) override;
116 virtual std::vector<int64_t> GetAvailableDataRates() override;
117 virtual void SetUseExternalRefclk(bool external) override;
118 virtual bool GetUseExternalRefclk() override;
119
120protected:
121
124
127
130
132 bool m_txInvert[4];
133
135 bool m_rxInvert[4];
136
138 float m_txDrive[4];
139
141 bool m_txEnable[4];
142
145
148
150 bool m_rxLock[4];
151
154
157
160
163
165 int64_t m_sampleX[4];
166
168 float m_sampleY[4];
169
172
175 {
178
181
184
187
190
193
196
199
202
204 SERDES
205 };
206
208 uint64_t m_dataRate;
209
210public:
211 static std::string GetDriverNameInternal();
212 BERT_INITPROC(MultiLaneBERT)
213};
214
215#endif
Pattern
Set of patterns we can generate or accept.
Definition: BERT.h:54
A MultiLANE BERT accessed via scopehal-mlbert-bridge.
Definition: MultiLaneBERT.h:47
virtual int64_t GetRefclkInFrequency() override
Gets the refclk in frequency, in Hz, required to generate the currently selected data rate.
Definition: MultiLaneBERT.cpp:529
RefclkMuxSelectors
Mux selectors for reference clock output.
Definition: MultiLaneBERT.h:175
@ RX1_DIV8
Lane 1 recovered clock, 1/8 rate.
Definition: MultiLaneBERT.h:183
@ SERDES
Custom pattern generator output.
Definition: MultiLaneBERT.h:204
@ RX0_DIV8
Lane 0 recovered clock, 1/8 rate.
Definition: MultiLaneBERT.h:177
@ RX2_DIV8
Lane 2 recovered clock, 1/8 rate.
Definition: MultiLaneBERT.h:189
@ LO_DIV32_OR_80
TX local oscillator divided by 32 (in low rate mode) or 80 (in high rate mode)
Definition: MultiLaneBERT.h:201
@ RX2_DIV16
Lane 2 recovered clock, 1/16 rate.
Definition: MultiLaneBERT.h:192
@ RX3_DIV8
Lane 3 recovered clock, 1/8 rate.
Definition: MultiLaneBERT.h:195
@ RX3_DIV16
Lane 3 recovered clock, 1/16 rate.
Definition: MultiLaneBERT.h:198
@ RX0_DIV16
Lane 0 recovered clock, 1/16 rate.
Definition: MultiLaneBERT.h:180
@ RX1_DIV16
Lane 1 recovered clock, 1/16 rate.
Definition: MultiLaneBERT.h:186
virtual bool GetRxCdrLockState(size_t i) override
Gets the RX CDR lock state (true=lock, false=unlock)
Definition: MultiLaneBERT.cpp:635
bool m_txInvert[4]
Transmit invert flag.
Definition: MultiLaneBERT.h:132
virtual size_t GetCustomPatternLength() override
Returns the number of bits in a custom pattern (may change with line rate)
Definition: MultiLaneBERT.cpp:290
size_t m_refclkOutMux
Reference clock output mux selector.
Definition: MultiLaneBERT.h:156
virtual bool GetRxInvert(size_t i) override
Gets the transmit invert flag for a channel.
Definition: MultiLaneBERT.cpp:185
virtual void SetDataRate(size_t i, int64_t rate) override
Sets the data rate (in symbols/sec)
Definition: MultiLaneBERT.cpp:593
virtual bool HasRefclkOut() override
Returns true if this instrument has a reference clock output port.
Definition: MultiLaneBERT.cpp:392
Pattern m_rxPattern[4]
Active receive pattern.
Definition: MultiLaneBERT.h:129
virtual std::vector< float > GetAvailableTxDriveStrengths(size_t i) override
Gets the list of available drive strengths (in volts) for a channel.
Definition: MultiLaneBERT.cpp:325
float m_txPreCursor[4]
TX FFE pre-cursor coefficient.
Definition: MultiLaneBERT.h:144
virtual std::vector< std::string > GetRefclkOutMuxNames() override
Gets the list of available reference clock mux settings.
Definition: MultiLaneBERT.cpp:455
virtual void SetRxPattern(size_t i, Pattern pattern) override
Sets the receive pattern for the selected channel.
Definition: MultiLaneBERT.cpp:142
bool m_rxLock[4]
RX pattern lock state.
Definition: MultiLaneBERT.h:150
virtual Pattern GetRxPattern(size_t i) override
Gets the currently selected receive pattern for a channel.
Definition: MultiLaneBERT.cpp:137
virtual float GetTxDriveStrength(size_t i) override
Get the drive strength for a channel.
Definition: MultiLaneBERT.cpp:336
virtual void SetUseExternalRefclk(bool external) override
Sets the reference clock source (internal or external)
Definition: MultiLaneBERT.cpp:537
virtual void SetTxDriveStrength(size_t i, float drive) override
Set the drive strength for a channel.
Definition: MultiLaneBERT.cpp:341
float m_txPostCursor[4]
TX FFE post-cursor coefficient.
Definition: MultiLaneBERT.h:147
virtual uint64_t GetGlobalCustomPattern() override
Gets the global custom pattern (only valid if IsCustomPatternPerChannel returns false)
Definition: MultiLaneBERT.cpp:302
float m_txDrive[4]
TX drive strength.
Definition: MultiLaneBERT.h:138
virtual std::vector< Pattern > GetAvailableTxPatterns(size_t i) override
Gets the list of available transmit patterns for a channel.
Definition: MultiLaneBERT.cpp:240
virtual size_t GetRefclkOutMux() override
Gets the currently selected reference clock output mux setting.
Definition: MultiLaneBERT.cpp:397
virtual std::vector< float > GetRxCTLEGainSteps() override
Get the list of available RX CTLE gain values (in dB)
Definition: MultiLaneBERT.cpp:205
Pattern m_txPattern[4]
Active transmit pattern.
Definition: MultiLaneBERT.h:126
virtual std::vector< int64_t > GetAvailableDataRates() override
Gets the list of available data rates, in symbols/sec.
Definition: MultiLaneBERT.cpp:603
virtual bool AcquireData() override
Pull data from the instrument.
Definition: MultiLaneBERT.cpp:810
virtual void SetBERIntegrationLength(int64_t uis) override
Set the integration period for BER measurements.
Definition: MultiLaneBERT.cpp:624
virtual bool HasRefclkIn() override
Returns true if this instrument has a reference clock input port.
Definition: MultiLaneBERT.cpp:387
virtual int64_t GetDataRate(size_t i) override
Gets the currently selected line rate (in symbols/sec)
Definition: MultiLaneBERT.cpp:588
virtual bool IsCustomPatternPerChannel() override
Determines whether custom patterns are settable per channel, or shared by the whole device.
Definition: MultiLaneBERT.cpp:285
static std::string GetDriverNameInternal()
Return the constant driver name "mlbert".
Definition: MultiLaneBERT.cpp:124
virtual bool GetTxInvert(size_t i) override
Gets the transmit invert flag for a channel.
Definition: MultiLaneBERT.cpp:310
virtual bool GetUseExternalRefclk() override
Sets the reference clock source.
Definition: MultiLaneBERT.cpp:551
virtual float GetTxPreCursor(size_t i) override
Get the pre-cursor equalizer tap for a channel.
Definition: MultiLaneBERT.cpp:362
virtual void SetRxInvert(size_t i, bool invert) override
Sets the receive invert flag for a channel.
Definition: MultiLaneBERT.cpp:190
int m_rxChannelBase
Index of the first receive channel.
Definition: MultiLaneBERT.h:123
bool m_rxInvert[4]
Receive invert flag.
Definition: MultiLaneBERT.h:135
virtual void SetRefclkOutMux(size_t i) override
Sets the reference clock output mux.
Definition: MultiLaneBERT.cpp:402
MultiLaneBERT(SCPITransport *transport)
Initialize the driver.
Definition: MultiLaneBERT.cpp:51
virtual uint32_t GetInstrumentTypesForChannel(size_t i) const override
Returns a bitfield describing the set of instrument types that a given channel supports.
Definition: MultiLaneBERT.cpp:129
int64_t m_integrationLength
BER integration period.
Definition: MultiLaneBERT.h:162
virtual float GetTxPostCursor(size_t i) override
Get the post-cursor equalizer tap for a channel.
Definition: MultiLaneBERT.cpp:373
virtual size_t GetRxCTLEGainStep(size_t i) override
Gets the currently selected RX CTLE gain index.
Definition: MultiLaneBERT.cpp:226
int64_t m_sampleX[4]
Sample X position for BER measurements.
Definition: MultiLaneBERT.h:165
bool m_txEnable[4]
Transmit enable flag.
Definition: MultiLaneBERT.h:141
uint64_t m_txCustomPattern
Bit pattern for TX custom-pattern mode.
Definition: MultiLaneBERT.h:153
virtual void SetTxInvert(size_t i, bool invert) override
Sets the transmit invert flag for a channel.
Definition: MultiLaneBERT.cpp:315
size_t m_rxCtleGainSteps[4]
CTLE gain step selected for each RX channel.
Definition: MultiLaneBERT.h:159
virtual void MeasureEye(size_t i) override
Acquires an eye pattern.
Definition: MultiLaneBERT.cpp:734
virtual std::vector< Pattern > GetAvailableRxPatterns(size_t i) override
Gets the list of available receive patterns for a channel.
Definition: MultiLaneBERT.cpp:170
virtual void SetBERSamplingPoint(size_t i, int64_t dx, float dy) override
Set the sampling point for BER measurements.
Definition: MultiLaneBERT.cpp:559
virtual void MeasureHBathtub(size_t i) override
Acquires a bathtub curve.
Definition: MultiLaneBERT.cpp:640
virtual bool GetTxEnable(size_t i) override
Gets the transmit enable flag for a channel.
Definition: MultiLaneBERT.cpp:357
virtual void SetTxPattern(size_t i, Pattern pattern) override
Sets the transmit pattern for the selected channel.
Definition: MultiLaneBERT.cpp:257
virtual int64_t GetRefclkOutFrequency() override
Gets the currently selected refclk out frequency, in Hz.
Definition: MultiLaneBERT.cpp:478
uint64_t m_dataRate
Current data rate, in bits/sec.
Definition: MultiLaneBERT.h:208
virtual void SetTxPostCursor(size_t i, float postcursor) override
Set the post-cursor equalizer tap for a channel.
Definition: MultiLaneBERT.cpp:378
float m_sampleY[4]
Sample Y position for BER measurements.
Definition: MultiLaneBERT.h:168
virtual Pattern GetTxPattern(size_t i) override
Gets the currently selected transmit pattern for a channel.
Definition: MultiLaneBERT.cpp:252
virtual void SetRxCTLEGainStep(size_t i, size_t step) override
Sets the RX CTLE gain index.
Definition: MultiLaneBERT.cpp:231
virtual void SetTxPreCursor(size_t i, float precursor) override
Set the pre-cursor equalizer tap for a channel.
Definition: MultiLaneBERT.cpp:367
virtual bool IsDataRatePerChannel() override
Determines whether the TX/RX clock is a per-instrument or per-channel setting.
Definition: MultiLaneBERT.cpp:583
virtual bool HasRxCTLE() override
Determines whether the input buffer has a continuous-time linear equalizer.
Definition: MultiLaneBERT.cpp:200
virtual void SetTxEnable(size_t i, bool enable) override
Sets the transmit enable flag for a channel.
Definition: MultiLaneBERT.cpp:347
virtual int64_t GetBERIntegrationLength() override
Get the integration period for BER measurements.
Definition: MultiLaneBERT.cpp:630
virtual void PostCtorInit() override
Do initialization after the constructor finishes.
Definition: MultiLaneBERT.cpp:78
bool m_useExternalRefclk
True if using external reference clock, false if internal.
Definition: MultiLaneBERT.h:171
virtual void GetBERSamplingPoint(size_t i, int64_t &dx, float &dy) override
Get the sampling point for BER measurements.
Definition: MultiLaneBERT.cpp:577
virtual void SetGlobalCustomPattern(uint64_t pattern) override
Sets the global custom pattern (only valid if IsCustomPatternPerChannel returns false)
Definition: MultiLaneBERT.cpp:295
An SCPI-based BERT.
Definition: SCPIBERT.h:38
An SCPI-based device.
Definition: SCPIDevice.h:37
Abstraction of a transport layer for moving SCPI data between endpoints.
Definition: SCPITransport.h:47