diff --git a/+adi/+AD4030/Rx.m b/+adi/+AD4030/Rx.m
new file mode 100644
index 0000000..86d8ae2
--- /dev/null
+++ b/+adi/+AD4030/Rx.m
@@ -0,0 +1,47 @@
+classdef Rx < adi.common.Rx ...
+ & adi.AD463x.Base
+
+ % AD4030-24 Precision ADC Class
+ % adi.AD4030.Rx Receives data from the AD4030-24 ADC
+ % The adi.AD4030.Rx System object is a signal source that can receive
+ % data from the AD4030-24.
+ %
+ % rx = adi.AD4030.Rx;
+ % rx = adi.AD4030.Rx('uri','192.168.2.1');
+ %
+ % AD4030-24 Datasheet
+
+ properties (Nontunable, Hidden, Constant)
+ Type = 'Rx'
+ end
+
+ properties (Hidden)
+ % Number of frames or buffers of data to capture
+ FrameCount = 1
+ end
+
+ properties (Nontunable, Hidden)
+
+ % Channels present with default register settings -
+ channel_names = {'differential0', 'differential1'}
+ end
+
+ properties (Hidden)
+ Timeout = Inf
+ kernelBuffersCount = 4
+ dataTypeStr = 'int32'
+ phyDevName = 'ad4030-24'
+ devName = 'ad4030-24'
+ end
+
+ methods
+
+ %% Constructor
+ function obj = Rx(varargin)
+ coder.allowpcode('plain');
+ obj = obj@adi.AD463x.Base(varargin{:});
+
+ end
+
+ end
+end
diff --git a/+adi/+AD4630_16/Rx.m b/+adi/+AD4630_16/Rx.m
new file mode 100644
index 0000000..f555eb6
--- /dev/null
+++ b/+adi/+AD4630_16/Rx.m
@@ -0,0 +1,47 @@
+classdef Rx < adi.common.Rx & adi.common.RxTx ...
+ & adi.AD463x.Base
+
+ % AD4630-16 Precision ADC Class
+ % adi.AD4630_16.Rx Receive data from the AD4630-16 ADC
+ % The adi.AD4630_16.Rx System object is a signal source that can receive
+ % data from the AD4630-16.
+ %
+ % rx = adi.AD4630_16.Rx;
+ % rx = adi.AD4630_16.Rx('uri','192.168.2.1');
+ %
+ % AD4630-16 Datasheet
+
+ properties (Nontunable, Hidden, Constant)
+ Type = 'Rx'
+ end
+
+ properties (Hidden)
+ % Number of frames or buffers of data to capture
+ FrameCount = 1
+ end
+
+ properties (Nontunable, Hidden)
+
+ % Channels present with default register settings -
+ channel_names = {'differential0', 'differential1'}
+ end
+
+ properties (Hidden)
+ Timeout = Inf
+ kernelBuffersCount = 4
+ dataTypeStr = 'int32'
+ phyDevName = 'ad4630-16'
+ devName = 'ad4630-16'
+ end
+
+ methods
+ %% Constructor
+
+ function obj = Rx(varargin)
+ coder.allowpcode('plain');
+ obj = obj@adi.AD463x.Base(varargin{:});
+
+ end
+
+ end
+end
diff --git a/+adi/+AD4630_24/Rx.m b/+adi/+AD4630_24/Rx.m
new file mode 100644
index 0000000..f63d9a5
--- /dev/null
+++ b/+adi/+AD4630_24/Rx.m
@@ -0,0 +1,46 @@
+classdef Rx < adi.common.Rx ...
+ & adi.AD463x.Base
+
+ % AD4630-24 Precision ADC Class
+ % adi.AD4630_24.Rx Receive data from the AD4630-24 ADC
+ % The adi.AD4630_24.Rx System object is a signal source that can receive
+ % data from the AD4630-24.
+ %
+ % rx = adi.AD4630_24.Rx;
+ % rx = adi.AD4630_24.Rx('uri','192.168.2.1');
+ %
+ % AD4630-24 Datasheet
+
+ properties (Nontunable, Hidden, Constant)
+ Type = 'Rx'
+ end
+
+ properties (Hidden)
+ % Number of frames or buffers of data to capture
+ FrameCount = 1
+ end
+
+ properties (Nontunable, Hidden)
+ % Channels present with default register settings -
+ channel_names = {'differential0', 'differential1'}
+ end
+
+ properties (Hidden)
+ Timeout = Inf
+ kernelBuffersCount = 4
+ dataTypeStr = 'int32'
+ phyDevName = 'ad4630-24'
+ devName = 'ad4630-24'
+ end
+
+ methods
+
+ %% Constructor
+ function obj = Rx(varargin)
+ coder.allowpcode('plain');
+ obj = obj@adi.AD463x.Base(varargin{:});
+
+ end
+
+ end
+end
diff --git a/+adi/+AD463x/Base.m b/+adi/+AD463x/Base.m
new file mode 100644
index 0000000..2686242
--- /dev/null
+++ b/+adi/+AD463x/Base.m
@@ -0,0 +1,241 @@
+classdef Base < adi.common.Rx & adi.common.RxTx & ...
+ matlabshared.libiio.base & adi.common.Attribute & ...
+ adi.common.RegisterReadWrite & adi.common.Channel
+ % AD463x is a family of Precision ADC
+ % AD4630-16 is dual channel 16bit SAR ADC with max sampling frequency
+ % of 2MSPS
+ % AD4630-24 is dual channel 24bit SAR ADC with max sampling frequency 2MSPS
+ % AD4030-24 is single channel version of AD4630-24
+
+ properties (Nontunable)
+ % SampleRate Sample Rate
+ % Baseband sampling rate in Hz, specified as a scalar
+ % in samples per second.
+ SampleRate = '1000000'
+ % SamplesPerFrame Samples Per Frame
+ % Number of samples per frame, specified as an even positive
+ % integer.
+ SamplesPerFrame = 2^15
+
+ % SampleAveragingLength
+ % Block length of samples to be averaged. Applied in the
+ % Averaging Mode register only when OUT_DATA_MD is set
+ % to 30-bit averaged differential mode
+ SampleAveragingLength = '2'
+ end
+
+ properties (Abstract, Nontunable, Hidden)
+ channel_names
+ end
+
+ properties (Hidden, Nontunable, Access = protected)
+ isOutput = false
+ end
+
+ properties (Abstract, Nontunable, Hidden)
+ Timeout
+ kernelBuffersCount
+ dataTypeStr
+ phyDevName
+ devName
+ end
+
+ properties (Hidden, Constant, Abstract)
+ Type
+ end
+
+ properties (Hidden, Constant)
+ ComplexData = false
+ SampleAveragingLengthSet = matlab.system.StringSet({ ...
+ '2', '4', '8', '16', '32', '64', '128', '256', ...
+ '512', '1024', '2048', '4096', '8192', '16384', ...
+ '32768', '65536'})
+ end
+
+ methods
+
+ %% Constructor
+ function obj = Base(varargin)
+ obj = obj@matlabshared.libiio.base(varargin{:});
+ obj.enableExplicitPolling = false;
+ obj.EnabledChannels = 1;
+ obj.BufferTypeConversionEnable = true;
+
+ % Check if uri has been specified, else throw an error
+ uriFound = 0;
+ for i = 1:length(varargin)
+ if isequal(varargin{i}, 'uri')
+ if i == length(varargin)
+ break
+ else
+ uriArgIndex = find(contains([varargin{:}], 'uri'));
+ obj.uri = varargin{uriArgIndex + 1};
+ uriFound = 1;
+ end
+ end
+ end
+ if uriFound == 0
+ error("Error. \nUri was not supplied. Supply it in the" + ...
+ " following manner \n %s", ...
+ "adi.ADXXXX.Rx('uri', )");
+ end
+
+ % Connects to device temporarily and fetches the channel names
+ obj.setup();
+ release(obj);
+ end
+
+ function set.SamplesPerFrame(obj, value)
+ validateattributes(value, { 'double', 'single', 'uint32' }, ...
+ { 'real', 'positive', 'scalar', 'finite', ...
+ 'nonnan', 'nonempty', 'integer', '>', 0, ...
+ '<', 2^20 + 1}, ...
+ '', 'SamplesPerFrame');
+ obj.SamplesPerFrame = value;
+ end
+
+ function set.SampleAveragingLength(obj, value)
+ validateattributes(value, { 'char', 'string'}, ...
+ {}, ...
+ '', 'SampleAveragingLength');
+ obj.SampleAveragingLength = value;
+
+ end
+
+ function flush(obj)
+ flushBuffers(obj);
+ end
+
+ function delete(obj)
+ delete@adi.common.RxTx(obj);
+ end
+
+ % Check SamplingRate
+ function set.SampleRate(obj, value)
+ obj.SampleRate = value;
+ if obj.ConnectedToDevice
+ obj.setDeviceAttributeRAW('sampling_frequency', value);
+ end
+ end
+
+ end
+
+ %% API Functions
+ methods (Hidden, Access = protected)
+
+ function setupInit(obj)
+ % Write all attributes to device once connected through set
+ % methods
+ % Do writes directly to hardware without using set methods.
+ % This is required sine Simulink support doesn't support
+ % modification to nontunable variables at SetupImpl
+ obj.setDeviceAttributeRAW('sampling_frequency', ...
+ num2str(obj.SampleRate));
+ if obj.getRegister('0x20') == 67 % Check if the
+ % current out-data-mode is 30bit averaging
+ obj.setDeviceAttributeRAW('sample_averaging', ...
+ obj.SampleAveragingLength);
+ end
+
+ obj.set_channel_names();
+
+ end
+
+ function set_channel_names(obj)
+ obj.channel_names = {};
+ phydev = getDev(obj, obj.devName);
+ chanCount = obj.iio_device_get_channels_count(phydev);
+ for c = 1:chanCount
+ chanPtr = obj.iio_device_get_channel(phydev, c - 1);
+ obj.channel_names{end + 1} = obj.iio_channel_get_name(chanPtr);
+ end
+ end
+
+ function [data, valid] = stepImpl(obj)
+ % [data,valid] = rx() returns data received from the radio
+ % hardware associated with the receiver System object, rx.
+ % The output 'valid' indicates whether the object has received
+ % data from the radio hardware. The first valid data frame can
+ % contain transient values, resulting in packets containing
+ % undefined data.
+ %
+ % The output 'data' will be an [NxM] vector where N is
+ % 'SamplesPerFrame' and M is the number of elements in
+ % 'EnabledChannels'. 'data' will be complex if the devices
+ % assumes complex data operations.
+
+ capCount = obj.FrameCount;
+
+ if obj.ComplexData
+ kd = 1;
+ ce = length(obj.EnabledChannels);
+ [dataRAW, valid] = getData(obj);
+ data = complex(zeros(obj.SamplesPerFrame, ce));
+ for k = 1:ce
+ data(:, k) = complex(dataRAW(kd, :), dataRAW(kd + 1, :)).';
+ kd = kd + 2;
+ end
+ else
+ if obj.BufferTypeConversionEnable
+
+ dataRAW = zeros([length(obj.EnabledChannels) ...
+ obj.SamplesPerFrame * capCount]);
+ for count = 1:capCount
+ [data_i, valid] = getData(obj);
+ dataRAW(:, obj.SamplesPerFrame * (count - 1) + ...
+ 1:count * obj.SamplesPerFrame) = data_i;
+ end
+ disp("Finished grabbing data. Processing it now...");
+ % Channels must be in columns or pointer math fails
+ dataRAW = dataRAW.';
+ [D1, D2] = size(dataRAW);
+ data = coder.nullcopy(zeros(D1, D2, obj.dataTypeStr));
+ dataPtr = libpointer(obj.ptrTypeStr, data);
+ dataRAWPtr = libpointer(obj.ptrTypeStr, dataRAW);
+ % Convert hardware format to human format channel by
+ % channel
+ for l = 0:D2 - 1
+ chanPtr = getChan(obj, obj.iioDev, ...
+ obj.channel_names{obj.EnabledChannels(l + 1)}, false);
+ % Pull out column
+ tmpPtrSrc = dataRAWPtr + D1 * l;
+ tmpPtrDst = dataPtr + D1 * l;
+ setdatatype(tmpPtrSrc, obj.ptrTypeStr, D1, 1);
+ setdatatype(tmpPtrDst, obj.ptrTypeStr, D1, 1);
+ for k = 0:D1 - 1
+ iio_channel_convert(obj, chanPtr, tmpPtrDst + k, tmpPtrSrc + k);
+ end
+ end
+ data = dataPtr.Value;
+ else
+ dataRAW = zeros([length(obj.EnabledChannels) obj.SamplesPerFrame * capCount]);
+ for count = 1:capCount
+ [data_i, valid] = getData(obj);
+ dataRAW(:, obj.SamplesPerFrame * (count - 1) + ...
+ 1:count * obj.SamplesPerFrame) = data_i;
+ end
+ data = dataRAW.';
+ end
+ end
+ end
+
+ end
+
+ %% External Dependency Methods
+ methods (Hidden, Static)
+
+ function tf = isSupportedContext(bldCfg)
+ tf = matlabshared.libiio.ExternalDependency.isSupportedContext(bldCfg);
+ end
+
+ function updateBuildInfo(buildInfo, bldCfg)
+ % Call the matlabshared.libiio.method first
+ matlabshared.libiio.ExternalDependency.updateBuildInfo(buildInfo, bldCfg);
+ end
+
+ function bName = getDescriptiveName(~)
+ bName = 'AD463x Precision ADC';
+ end
+
+ end
+end
diff --git a/+adi/+AD7380/Rx.m b/+adi/+AD7380/Rx.m
new file mode 100644
index 0000000..e880f12
--- /dev/null
+++ b/+adi/+AD7380/Rx.m
@@ -0,0 +1,169 @@
+classdef Rx < adi.common.Rx & matlabshared.libiio.base & adi.common.Attribute
+ % AD7380 Precision ADC Class
+ % adi.AD7380.Rx Receives data from the AD7380 ADC
+ % The adi.AD7380.Rx System object is a signal source that can receive
+ % data from the AD7380.
+ %
+ % rx = adi.AD7380.Rx;
+ % rx = adi.AD7380.Rx('uri','192.168.2.1');
+ %
+ % AD7380 Datasheet
+
+ properties (Nontunable)
+ % SampleRate Sample Rate
+ % Baseband sampling rate in Hz, specified as a scalar
+ % in samples per second. Options are:
+ % '256000','128000','64000','32000','16000','8000','4000',
+ % '2000','1000'
+ SampleRate = '4000000'
+ SamplesPerFrame = 1024
+ end
+
+ properties (Hidden)
+ % Number of frames or buffers of data to capture
+ FrameCount = 1
+ end
+
+ % Channel names
+ properties (Nontunable, Hidden, Constant)
+ channel_names = {
+ 'voltage0'
+ 'voltage1'
+ }
+ Type = 'Rx'
+ end
+
+ % isOutput
+ properties (Hidden, Nontunable, Access = protected)
+ isOutput = false
+ end
+
+ properties (Constant, Hidden)
+ SampleRateSet = matlab.system.StringSet({'4000000', '256000', '128000', '64000', ...
+ '32000', '16000', '8000', '4000', '2000', '1000'})
+
+ end
+
+ properties (Nontunable, Hidden)
+ Timeout = Inf
+ kernelBuffersCount = 2
+ % dataTypeStr = 'int64';
+ dataTypeStr = 'int16'
+ phyDevName = 'ad7380'
+ devName = 'ad7380'
+ end
+
+ properties (Hidden, Constant)
+ ComplexData = false
+ end
+
+ methods
+
+ %% Constructor
+ function obj = Rx(varargin)
+ obj = obj@matlabshared.libiio.base(varargin{:});
+ obj.enableExplicitPolling = false;
+ obj.EnabledChannels = 1;
+ obj.BufferTypeConversionEnable = true;
+ obj.uri = 'ip:analog.local';
+ end
+
+ function flush(obj)
+ flushBuffers(obj);
+ end
+
+ % Check SamplingRate
+ function set.SampleRate(obj, value)
+ obj.SampleRate = value;
+ if obj.ConnectedToDevice
+ obj.setDeviceAttributeRAW('sampling_frequency', value);
+ end
+ end
+
+ end
+
+ %% API Functions
+ methods (Hidden, Access = protected)
+
+ function setupInit(obj)
+ % Write all attributes to device once connected through set
+ % methods
+ % Do writes directly to hardware without using set methods.
+ % This is required since Simulink support doesn't support
+ % modification to nontunable variables at SetupImpl
+
+ % obj.setDeviceAttributeRAW('sampling_frequency',num2str(obj.SampleRate));
+
+ end
+
+ function [data, valid] = stepImpl(obj)
+ % [data,valid] = rx() returns data received from the radio
+ % hardware associated with the receiver System object, rx.
+ % The output 'valid' indicates whether the object has received
+ % data from the radio hardware. The first valid data frame can
+ % contain transient values, resulting in packets containing
+ % undefined data.
+ %
+ % The output 'data' will be an [NxM] vector where N is
+ % 'SamplesPerFrame' and M is the number of elements in
+ % 'EnabledChannels'. 'data' will be complex if the devices
+ % assumes complex data operations.
+
+ capCount = obj.FrameCount;
+
+ if obj.ComplexData
+ kd = 1;
+ ce = length(obj.EnabledChannels);
+ [dataRAW, valid] = getData(obj);
+ data = complex(zeros(obj.SamplesPerFrame, ce));
+ for k = 1:ce
+ data(:, k) = complex(dataRAW(kd, :), dataRAW(kd + 1, :)).';
+ kd = kd + 2;
+ end
+ else
+ if obj.BufferTypeConversionEnable
+
+ dataRAW = zeros([length(obj.EnabledChannels) obj.SamplesPerFrame * capCount]);
+ for count = 1:capCount
+ [data_i, valid] = getData(obj);
+ dataRAW(:, obj.SamplesPerFrame * (count - 1) + ...
+ 1:count * obj.SamplesPerFrame) = data_i;
+ end
+ disp("Finished grabbing data. Processing it now...");
+ % Channels must be in columns or pointer math fails
+ dataRAW = dataRAW.';
+ [D1, D2] = size(dataRAW);
+ data = coder.nullcopy(zeros(D1, D2, obj.dataTypeStr));
+ dataPtr = libpointer(obj.ptrTypeStr, data);
+ dataRAWPtr = libpointer(obj.ptrTypeStr, dataRAW);
+ % Convert hardware format to human format channel by
+ % channel
+ for l = 0:D2 - 1
+ chanPtr = getChan(obj, obj.iioDev, ...
+ obj.channel_names{obj.EnabledChannels(l + 1)}, false);
+ % Pull out column
+ tmpPtrSrc = dataRAWPtr + D1 * l;
+ tmpPtrDst = dataPtr + D1 * l;
+ setdatatype(tmpPtrSrc, obj.ptrTypeStr, D1, 1);
+ setdatatype(tmpPtrDst, obj.ptrTypeStr, D1, 1);
+ for k = 0:D1 - 1
+ iio_channel_convert(obj, chanPtr, tmpPtrDst + k, tmpPtrSrc + k);
+ end
+ end
+ data = dataPtr.Value;
+ else
+ dataRAW = zeros([length(obj.EnabledChannels) ...
+ obj.SamplesPerFrame * capCount]);
+ for count = 1:capCount
+ [data_i, valid] = getData(obj);
+ dataRAW(:, obj.SamplesPerFrame * (count - 1) + ...
+ 1 : count * obj.SamplesPerFrame) = data_i;
+ end
+
+ data = dataRAW.';
+ end
+ end
+ end
+
+ end
+end
diff --git a/+adi/+AD7768/Base.m b/+adi/+AD7768/Base.m
new file mode 100644
index 0000000..feb6e00
--- /dev/null
+++ b/+adi/+AD7768/Base.m
@@ -0,0 +1,162 @@
+classdef (Abstract, Hidden = true) Base < ...
+ adi.common.RxTx & ...
+ adi.common.Attribute & ...
+ adi.common.DebugAttribute & ...
+ matlabshared.libiio.base & ...
+ adi.common.Rx
+
+ properties (Nontunable)
+ % SamplesPerFrame Samples Per Frame
+ % Number of samples per frame, specified as an even positive
+ % integer from 2 to 16,777,216. Using values less than 3660 can
+ % yield poor performance.
+ SamplesPerFrame = 2^15
+ end
+
+ properties (Abstract)
+ % SamplingRate Sampling Rate
+ % Baseband sampling rate in Hz, specified as a scalar
+ % from 65105 to 61.44e6 samples per second.
+ SampleRate
+
+ end
+
+ properties (Abstract, Nontunable, Hidden)
+ Timeout
+ kernelBuffersCount
+ dataTypeStr
+ phyDevName
+ devName
+ end
+
+ properties (Hidden, Constant)
+ ComplexData = false
+ end
+
+ methods
+
+ %% Constructor
+ function obj = Base(varargin)
+ coder.allowpcode('plain');
+ obj = obj@matlabshared.libiio.base(varargin{:});
+ end
+
+ % Destructor
+ function delete(obj)
+ delete@adi.common.RxTx(obj);
+ end
+
+ % Check SamplesPerFrame
+ function set.SamplesPerFrame(obj, value)
+ validateattributes(value, { 'double', 'single', 'uint32'}, ...
+ { 'real', 'positive', 'scalar', 'finite', ...
+ 'nonnan', 'nonempty', 'integer', '>', 0, '<=', 2^20}, ...
+ '', 'SamplesPerFrame');
+ obj.SamplesPerFrame = value;
+ end
+
+ end
+
+ %% API Functions
+ methods (Hidden, Access = protected)
+
+ function icon = getIconImpl(obj)
+ icon = sprintf(['AD7768 ', obj.Type]);
+ end
+
+ function [data, valid] = stepImpl(obj)
+ % [data,valid] = rx() returns data received from the radio
+ % hardware associated with the receiver System object, rx.
+ % The output 'valid' indicates whether the object has received
+ % data from the radio hardware. The first valid data frame can
+ % contain transient values, resulting in packets containing
+ % undefined data.
+ %
+ % The output 'data' will be an [NxM] vector where N is
+ % 'SamplesPerFrame' and M is the number of elements in
+ % 'EnabledChannels'. 'data' will be complex if the devices
+ % assumes complex data operations.
+
+ % Get the data
+
+ capCount = obj.FrameCount;
+
+ if obj.ComplexData
+ kd = 1;
+ ce = length(obj.EnabledChannels);
+ [dataRAW, valid] = getData(obj);
+ data = complex(zeros(obj.SamplesPerFrame, ce));
+ for k = 1:ce
+ data(:, k) = complex(dataRAW(kd, :), dataRAW(kd + 1, :)).';
+ kd = kd + 2;
+ end
+ else
+ if obj.BufferTypeConversionEnable
+
+ dataRAW = zeros([length(obj.EnabledChannels) ...
+ obj.SamplesPerFrame * capCount]);
+ for count = 1:capCount
+ [data_i, valid] = getData(obj);
+ % dataRAW = cat(2, dataRAW, data_i);
+
+ dataRAW(:, obj.SamplesPerFrame * (count - 1) + ...
+ 1:count * obj.SamplesPerFrame) = data_i;
+ end
+ disp("Finished grabbing data. Processing it now...");
+ % Channels must be in columns or pointer math fails
+ dataRAW = dataRAW.';
+ [D1, D2] = size(dataRAW);
+ data = coder.nullcopy(zeros(D1, D2, obj.dataTypeStr));
+ dataPtr = libpointer(obj.ptrTypeStr, data);
+ dataRAWPtr = libpointer(obj.ptrTypeStr, dataRAW);
+ % Convert hardware format to human format channel by
+ % channel
+ for l = 0:D2 - 1
+ chanPtr = getChan(obj, obj.iioDev, ...
+ obj.channel_names{obj.EnabledChannels(l + 1)}, false);
+ % Pull out column
+ tmpPtrSrc = dataRAWPtr + D1 * l;
+ tmpPtrDst = dataPtr + D1 * l;
+ setdatatype(tmpPtrSrc, obj.ptrTypeStr, D1, 1);
+ setdatatype(tmpPtrDst, obj.ptrTypeStr, D1, 1);
+ for k = 0:D1 - 1
+ iio_channel_convert(obj, chanPtr, tmpPtrDst + k, tmpPtrSrc + k);
+ end
+ end
+ data = dataPtr.Value;
+ else
+ dataRAW = zeros([length(obj.EnabledChannels) ...
+ obj.SamplesPerFrame * capCount]);
+ for count = 1:capCount
+ [data_i, valid] = getData(obj);
+ % dataRAW = cat(2, dataRAW, data_i);
+
+ dataRAW(:, obj.SamplesPerFrame * (count - 1) + ...
+ 1:count * obj.SamplesPerFrame) = data_i;
+ end
+
+ data = dataRAW.';
+ end
+ end
+ end
+
+ end
+
+ %% External Dependency Methods
+ methods (Hidden, Static)
+
+ function tf = isSupportedContext(bldCfg)
+ tf = matlabshared.libiio.ExternalDependency.isSupportedContext(bldCfg);
+ end
+
+ function updateBuildInfo(buildInfo, bldCfg)
+ % Call the matlabshared.libiio.method first
+ matlabshared.libiio.ExternalDependency.updateBuildInfo(buildInfo, bldCfg);
+ end
+
+ function bName = getDescriptiveName(~)
+ bName = 'AD7768';
+ end
+
+ end
+end
diff --git a/+adi/+AD7768/Rx.m b/+adi/+AD7768/Rx.m
new file mode 100644
index 0000000..0869a22
--- /dev/null
+++ b/+adi/+AD7768/Rx.m
@@ -0,0 +1,124 @@
+classdef Rx < adi.AD7768.Base & matlabshared.libiio.base & adi.common.Attribute
+ % AD7768 Precision ADC Class
+ % adi.AD7768.Rx Receives data from the AD7768 ADC
+ % The adi.AD7768.Rx System object is a signal source that can receive
+ % data from the AD7768.
+ %
+ % rx = adi.AD7768.Rx;
+ % rx = adi.AD7768.Rx('uri','192.168.2.1');
+ %
+ % AD7768 Datasheet
+
+ properties (Nontunable)
+ % SampleRate Sample Rate
+ % Baseband sampling rate in Hz, specified as a scalar
+ % in samples per second. Options are:
+ % '256000','128000','64000','32000','16000','8000','4000',
+ % '2000','1000'
+ SampleRate = '256000'
+
+ end
+
+ properties (Hidden)
+ % Number of frames or buffers of data to capture
+ FrameCount = 1
+ end
+
+ properties (Nontunable, Hidden, Constant)
+ channel_names = { ...
+ 'voltage0', 'voltage1', 'voltage2', 'voltage3', ...
+ 'voltage4', 'voltage5', 'voltage6', 'voltage7'}
+ end
+
+ properties (Hidden, Nontunable, Access = protected)
+ isOutput = false
+ end
+
+ properties (Constant, Hidden)
+ SampleRateSet = matlab.system.StringSet({ ...
+ '256000', '128000', '64000', ...
+ '32000', '16000', '8000', '4000', ...
+ '2000', '1000'})
+
+ end
+
+ properties (Nontunable, Hidden)
+ Timeout = Inf
+ kernelBuffersCount = 2
+ dataTypeStr = 'int32'
+ phyDevName = 'ad7768'
+ devName = 'ad7768'
+ end
+
+ properties (Nontunable, Hidden, Constant)
+ Type = 'Rx'
+
+ end
+
+ methods
+
+ %% Constructor
+ function obj = Rx(varargin)
+ obj = obj@matlabshared.libiio.base(varargin{:});
+ obj.enableExplicitPolling = false;
+ obj.EnabledChannels = 1;
+ obj.BufferTypeConversionEnable = true;
+ obj.uri = 'ip:analog.local';
+ end
+
+ function flush(obj)
+ flushBuffers(obj);
+ end
+
+ % Check SamplingRate
+ function set.SampleRate(obj, value)
+ obj.SampleRate = value;
+ if obj.ConnectedToDevice
+ obj.setDeviceAttributeRAW('sampling_frequency', value);
+ end
+ end
+
+ end
+
+ methods (Access = protected)
+
+ function numOut = getNumOutputsImpl(~)
+ numOut = 1;
+ end
+
+ end
+
+ %% API Functions
+ methods (Hidden, Access = protected)
+
+ function setupInit(obj)
+ % Write all attributes to device once connected through set
+ % methods
+ % Do writes directly to hardware without using set methods.
+ % This is required since Simulink doesn't support
+ % modification to nontunable variables at SetupImpl
+
+ obj.setDeviceAttributeRAW('sampling_frequency', num2str(obj.SampleRate));
+
+ end
+
+ end
+
+ %% External Dependency Methods
+ methods (Hidden, Static)
+
+ function tf = isSupportedContext(bldCfg)
+ tf = matlabshared.libiio.ExternalDependency.isSupportedContext(bldCfg);
+ end
+
+ function updateBuildInfo(buildInfo, bldCfg)
+ % Call the matlabshared.libiio.method first
+ matlabshared.libiio.ExternalDependency.updateBuildInfo(buildInfo, bldCfg);
+ end
+
+ function bName = getDescriptiveName(~)
+ bName = 'AD7768 Precision ADC';
+ end
+
+ end
+end
diff --git a/+adi/+AD7768_1/Rx.m b/+adi/+AD7768_1/Rx.m
new file mode 100644
index 0000000..8004a40
--- /dev/null
+++ b/+adi/+AD7768_1/Rx.m
@@ -0,0 +1,146 @@
+classdef Rx < adi.AD7768.Base & matlabshared.libiio.base & adi.common.Attribute
+ % AD7768-1 Precision ADC Class
+ % adi.AD7768_1.Rx Receives data from the AD7768-1 ADC
+ % The adi.AD7768_1.Rx System object is a signal source that can receive
+ % data from the AD7768-1.
+ %
+ % rx = adi.AD7768_1.Rx;
+ % rx = adi.AD7768_1.Rx('uri','192.168.2.1');
+ %
+ % AD7768-1 Datasheet
+
+ properties (Nontunable)
+ % SampleRate Sample Rate
+ % Baseband sampling rate in Hz, specified as a scalar
+ % in samples per second. Options are:
+ % '256000','128000','64000','32000','16000','8000','4000',
+ % '2000','1000'
+ SampleRate = '256000'
+
+ % SCommonModeVolts Common Mode Voltage
+ % Common mode voltage in volts, specified as a string
+ % Options are:
+ % '(AVDD1-AVSS)/2','2V5','2V05','1V9','1V65','1V1','0V9','OFF'
+ CommonModeVolts = '(AVDD1-AVSS)/2'
+
+ end
+
+ properties (Hidden)
+ % Number of frames or buffers of data to capture
+ FrameCount = 1
+ end
+
+ properties (Nontunable, Hidden, Constant)
+ channel_names = { ...
+ 'voltage0'}
+ end
+
+ properties (Hidden, Nontunable, Access = protected)
+ isOutput = false
+ end
+
+ properties (Constant, Hidden)
+ SampleRateSet = matlab.system.StringSet({ ...
+ '256000', '128000', '64000', ...
+ '32000', '16000', '8000', '4000', ...
+ '2000', '1000'})
+
+ CommonModeVoltsSet = matlab.system.StringSet({ '(AVDD1-AVSS)/2', '2V5', ...
+ '2V05', '1V9', '1V65', '1V1', '0V9', 'OFF'})
+
+ end
+
+ properties (Nontunable, Hidden)
+ Timeout = Inf
+ kernelBuffersCount = 2
+ dataTypeStr = 'int32'
+ phyDevName = 'ad7768-1'
+ devName = 'ad7768-1'
+ end
+
+ properties (Nontunable, Hidden, Constant)
+ Type = 'Rx'
+
+ end
+
+ methods
+
+ %% Constructor
+ function obj = Rx(varargin)
+ obj = obj@matlabshared.libiio.base(varargin{:});
+ obj.enableExplicitPolling = false;
+ obj.EnabledChannels = 1;
+ obj.BufferTypeConversionEnable = true;
+ obj.uri = 'ip:analog.local';
+ end
+
+ function flush(obj)
+ flushBuffers(obj);
+ end
+
+ % Check SamplingRate
+ function set.SampleRate(obj, value)
+ obj.SampleRate = value;
+ if obj.ConnectedToDevice
+ obj.setDeviceAttributeRAW('sampling_frequency', value);
+ end
+ end
+
+ % Check SamplesPerFrame
+ function set.CommonModeVolts(obj, value)
+ validateattributes(value, { 'char', 'string'}, ...
+ { 'nonempty'}, ...
+ '', 'CommonModeVolts');
+ obj.CommonModeVolts = value;
+ end
+
+ end
+
+ methods (Access = protected)
+
+ function numOut = getNumOutputsImpl(~)
+ % numOut = 1;
+ numOut = 2;
+ end
+
+ end
+
+ %% Sensor specific APIs
+ methods
+ end
+
+ %% API Functions
+ methods (Hidden, Access = protected)
+
+ function setupInit(obj)
+ % Write all attributes to device once connected through set
+ % methods
+ % Do writes directly to hardware without using set methods.
+ % This is required since Simulink doesn't support
+ % modification to nontunable variables at SetupImpl
+
+ obj.setDeviceAttributeRAW('sampling_frequency', num2str(obj.SampleRate));
+ obj.setDeviceAttributeRAW('common_mode_voltage', obj.CommonModeVolts);
+
+ end
+
+ end
+
+ %% External Dependency Methods
+ methods (Hidden, Static)
+
+ function tf = isSupportedContext(bldCfg)
+ tf = matlabshared.libiio.ExternalDependency.isSupportedContext(bldCfg);
+ end
+
+ function updateBuildInfo(buildInfo, bldCfg)
+ % Call the matlabshared.libiio.method first
+ matlabshared.libiio.ExternalDependency.updateBuildInfo(buildInfo, bldCfg);
+ end
+
+ function bName = getDescriptiveName(~)
+ bName = 'AD7768-1 Precision ADC';
+ end
+
+ end
+end
diff --git a/+adi/+common b/+adi/+common
new file mode 160000
index 0000000..2463dfa
--- /dev/null
+++ b/+adi/+common
@@ -0,0 +1 @@
+Subproject commit 2463dfa888d255f38054d22dcc31b535ea62cee6
diff --git a/+adi/Contents.m b/+adi/Contents.m
new file mode 100644
index 0000000..5823d37
--- /dev/null
+++ b/+adi/Contents.m
@@ -0,0 +1,13 @@
+% Analog Devices, Inc. Precision Toolbox
+% Version 21.2.1 (R2021b)
+%
+% ==== Table of Contents (TOC) ====
+%
+% Parts
+% -----------------------
+% AD7380 - ADC
+% AD7768 - ADC
+% AD7768-1 - ADC
+% AD4030-24 - ADC
+% AD4630-16 - ADC
+% AD4630-24 - ADC
diff --git a/+adi/Version.m b/+adi/Version.m
new file mode 100644
index 0000000..cffb464
--- /dev/null
+++ b/+adi/Version.m
@@ -0,0 +1,16 @@
+classdef Version
+ % Version
+ % BSP Version information
+ properties (Constant)
+ MATLAB = 'R2021b'
+ Release = '21.2.1'
+ AppName = 'Analog Devices, Inc. Precision Toolbox'
+ ToolboxName = 'PrecisionToolbox'
+ ToolboxNameShort = 'pcx'
+ ExamplesDir = 'examples'
+ HasHDL = false
+ end
+
+ methods
+ end
+end
diff --git a/.github/workflows/doc.yml b/.github/workflows/doc.yml
new file mode 100644
index 0000000..8ef569d
--- /dev/null
+++ b/.github/workflows/doc.yml
@@ -0,0 +1,29 @@
+name: Documentation
+
+on: [push, pull_request]
+
+jobs:
+ BuildDocs:
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v2
+ - name: Set up Python 3.7
+ uses: actions/setup-python@v2
+ with:
+ python-version: 3.7
+
+ - name: Install dependencies
+ run: |
+ sudo apt install -y python3-numpy
+ pip install -r requirements_doc.txt
+ - name: Check doc build
+ run: |
+ make -C CI/gen_doc doc
+ - name: Publish master doc
+ if: github.ref == 'refs/heads/master'
+ uses: peaceiris/actions-gh-pages@v3
+ with:
+ github_token: ${{ secrets.GITHUB_TOKEN }}
+ publish_dir: ./doc
+ destination_dir: master
\ No newline at end of file
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000..12bf1fc
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "+adi/+common"]
+ path = +adi/+common
+ url = https://github.com/analogdevicesinc/ToolboxCommon.git
diff --git a/CI/doc/ADITTBHome.m b/CI/doc/ADITTBHome.m
new file mode 100644
index 0000000..f29a4cd
--- /dev/null
+++ b/CI/doc/ADITTBHome.m
@@ -0,0 +1,59 @@
+%% ANALOG DEVICES INC. Precision Converter TOOLBOX SUPPORT PACKAGE
+% Analog Devices Inc. Precision Converter Toolbox Support Package for Analog
+% Devices Precision Converters enable the user in designing and prototyping
+% practical wireless systems. Using MATLAB system objects provided with
+% this support package, you can use ADI Precision Converter products to either
+% capture streaming RF data and apply signal processing algorithms in
+% MATLAB or utilize the provided HDL infrastructre to develop targetable
+% designs that process RF data on the fly, thereby facilitating
+% the design, development and testing of modem designs under real-world
+% conditions.
+%
+%
+%{
+Refer to existing documentation as much as possible. Only provide an
+overview from a MATLAB perspective.
+%}
+%
+%
+%{
+Describe API in a unified manner to appeal to all users regardless of
+whether Pluto, AD936x, AD937x, ADRV900x is being used to run code examples.
+%}
+%
+%
+%{
+What does HDL coder do?
+IQ in IQ out
+Valid in Valid out
+Discussion on targeting from a non-AD9361 perspective since MATLAB
+documentation has AD9361 perspective on HDL. Point to wiki page on
+Precision Converter toolbox. But, update it first.
+%}
+%
+%
+%{
+Streaming Examples
+Targeting Examples (Workflow from MATLAB Algorithm implementation to FPGA
+targeting) - point to the donut diagram
+Show examples the way MATLAB doc shows - demos.xml, similarly, see if there is an apps.xml
+published examples,
+%}
+%
+%
+%
+%{
+State Management
+- When you change an attribute, when does it take effect?
+- What happens when you run the system object operator?
+- CenterFrequency gets written to hardware immediately in ADITB, not so in
+MWTB. Illustrate by sine wave, FFT plot or iio_attr commands.
+Attributes
+Debug Attributes
+Fast lock/frequency hopping
+...
+...
+AGC Tuning (For AD936x)
+%}
+%
+%
\ No newline at end of file
diff --git a/CI/doc/ADI_Logo_AWP_Large.png b/CI/doc/ADI_Logo_AWP_Large.png
new file mode 100644
index 0000000..7a11a0c
Binary files /dev/null and b/CI/doc/ADI_Logo_AWP_Large.png differ
diff --git a/CI/doc/Buffers.mlx b/CI/doc/Buffers.mlx
new file mode 100644
index 0000000..ad4d554
Binary files /dev/null and b/CI/doc/Buffers.mlx differ
diff --git a/CI/doc/CodeExamples.mlx b/CI/doc/CodeExamples.mlx
new file mode 100644
index 0000000..bc17764
Binary files /dev/null and b/CI/doc/CodeExamples.mlx differ
diff --git a/CI/doc/Examples.mlx b/CI/doc/Examples.mlx
new file mode 100644
index 0000000..72ddc63
Binary files /dev/null and b/CI/doc/Examples.mlx differ
diff --git a/CI/doc/ForDevs.mlx b/CI/doc/ForDevs.mlx
new file mode 100644
index 0000000..9046205
Binary files /dev/null and b/CI/doc/ForDevs.mlx differ
diff --git a/CI/doc/StateMgmt.mlx b/CI/doc/StateMgmt.mlx
new file mode 100644
index 0000000..1595116
Binary files /dev/null and b/CI/doc/StateMgmt.mlx differ
diff --git a/CI/doc/Support.mlx b/CI/doc/Support.mlx
new file mode 100644
index 0000000..1f27e8c
Binary files /dev/null and b/CI/doc/Support.mlx differ
diff --git a/CI/doc/SupportedHardware.mlx b/CI/doc/SupportedHardware.mlx
new file mode 100644
index 0000000..fbdb86a
Binary files /dev/null and b/CI/doc/SupportedHardware.mlx differ
diff --git a/CI/doc/SysObjsProps.m b/CI/doc/SysObjsProps.m
new file mode 100644
index 0000000..32da009
--- /dev/null
+++ b/CI/doc/SysObjsProps.m
@@ -0,0 +1,9 @@
+%% System Object Properties
+% This section lists the system object properties for devices and
+% evaluation boards supported by Precision Converter Toolbox.
+%%% Devices
+% * AD4630
+% * AD4030
+% * AD463x
+% * AD7768
+
diff --git a/CI/doc/SystemObjects.mlx b/CI/doc/SystemObjects.mlx
new file mode 100644
index 0000000..e554404
Binary files /dev/null and b/CI/doc/SystemObjects.mlx differ
diff --git a/CI/doc/adi_bsp.mlx b/CI/doc/adi_bsp.mlx
new file mode 100644
index 0000000..e7d7cad
Binary files /dev/null and b/CI/doc/adi_bsp.mlx differ
diff --git a/CI/doc/customDoc.m b/CI/doc/customDoc.m
new file mode 100644
index 0000000..6d9071c
--- /dev/null
+++ b/CI/doc/customDoc.m
@@ -0,0 +1,163 @@
+function html = customDoc(str)
+ % Make sure that we can support the doc command on this platform.
+ if ~usejava('mwt')
+ error(message('MATLAB:doc:UnsupportedPlatform', upper(mfilename)));
+ end
+
+ % Examine the inputs to see what options are selected.
+ [showClassicDoc, topic, search, isVariable] = examineInputs(str);
+ if isVariable
+ varName = inputname(isVariable);
+ elseif ~isempty(topic) && nargin == 1
+ wsVariables = evalin('caller', 'whos');
+ [topic, isVariable, varName] = matlab.internal.help.getClassNameFromWS(topic, wsVariables, true);
+ end
+ if search
+ docsearch(topic);
+ return;
+ end
+ % Check this before checking docroot, the -classic option is used to show doc not under docroot.
+ if showClassicDoc
+ com.mathworks.mlservices.MLHelpServices.invokeClassicHelpBrowser();
+ return;
+ end
+
+ % Make sure docroot is valid.
+ if ~matlab.internal.help.isDocInstalled
+ % If m-file help is available for this topic, call helpwin.
+ if ~isempty(topic)
+ if showHelpwin(topic)
+ return;
+ end
+ end
+
+ % Otherwise show the appropriate error page.
+ htmlFile = fullfile(matlabroot,'toolbox','local','helperr.html');
+
+ if exist(htmlFile, 'file') ~= 2
+ error(message('MATLAB:doc:HelpErrorPageNotFound', htmlFile));
+ end
+ displayFile(htmlFile);
+ return;
+ end
+
+ % Case no topic specified.
+ if isempty(topic)
+ % Just open the help browser and display the default startup page.
+ com.mathworks.mlservices.MLHelpServices.invoke();
+ return;
+ end
+
+ if strncmpi(topic, 'mupad/', 6)
+ if ~mupaddoc(topic)
+ showNoReferencePageFound;
+ end
+ return;
+ end
+
+ [operator,topic] = matlab.internal.language.introspective.isOperator(topic);
+ if ~operator
+ if topic(end) == '/'
+ topic = topic(1:end-1);
+ end
+
+ if showProductPage(topic)
+ return;
+ end
+
+ [possibleTopics, isPrimitive] = matlab.internal.help.resolveDocTopic(topic, isVariable);
+
+ if isPrimitive
+ disp(matlab.internal.help.getInstanceIsa(varName, topic));
+ return;
+ end
+ else
+ [~,possibleTopics.topic] = fileparts(topic);
+ possibleTopics.isElement = false;
+ end
+
+ [foundTopic, html] = showHelpwin(topic);
+ if ~displayDocPage(possibleTopics) && ~foundTopic
+ docsearch(topic);
+ end
+end
+
+function [showClassicDoc, topic, search, varIndex] = examineInputs(str)
+ showClassicDoc = 0;
+ topic = [];
+ search = 0;
+ varIndex = 0;
+
+ % for i = 1:numel(str)
+ argName = str; % str{i};
+ if isstring(argName)
+ if ~isscalar(argName)
+ MException(message('MATLAB:doc:MustBeSingleString')).throwAsCaller;
+ end
+ argName = char(strip(argName));
+ elseif ischar(argName)
+ argName = strtrim(argName);
+ else
+ argName = class(argName);
+ % varIndex = i;
+ end
+
+ if strcmp(argName, '-classic')
+ showClassicDoc = 1;
+ else
+ % assume this is the location.
+ if ~isempty(topic)
+ topic = sprintf('%s %s', topic, argName);
+ search = 1;
+ else
+ topic = argName;
+ end
+ end
+ % end
+end
+
+function success = showProductPage(topic)
+ success = com.mathworks.mlservices.MLHelpServices.showProductPage(topic);
+end
+
+function success = displayDocPage(possibleTopics)
+ success = false;
+ for topic = possibleTopics
+ if com.mathworks.mlservices.MLHelpServices.showReferencePage(topic.topic, topic.isElement)
+ success = true;
+ return;
+ end
+ end
+
+ for topic = possibleTopics
+ if matlab.internal.doc.isLiveCodeAndHasDocumentation(topic.topic)
+ internal.help.livecodedoc.mlxdoc(topic.topic);
+ success = true;
+ return;
+ end
+ end
+end
+
+function [foundTopic, html] = showHelpwin(topic)
+ % turn off the warning message about helpwin being removed in a future
+ % release
+ s = warning('off', 'MATLAB:helpwin:FunctionToBeRemoved');
+ [foundTopic, html] = customHelpwin(topic, '', '', '-doc');
+
+ % turn the warning message back on if it was on to begin with
+ warning(s.state, 'MATLAB:helpwin:FunctionToBeRemoved');
+end
+
+function showNoReferencePageFound(topic)
+ noFuncPage = matlab.internal.help.underDocroot('nofunc.html');
+ if ~isempty(noFuncPage)
+ displayFile(noFuncPage);
+ else
+ error(message('MATLAB:doc:InvalidTopic', topic));
+ end
+end
+
+function displayFile(htmlFile)
+ % Display the file inside the help browser.
+ web(htmlFile, '-helpbrowser');
+end
diff --git a/CI/doc/customHelpwin.m b/CI/doc/customHelpwin.m
new file mode 100644
index 0000000..d9e1a74
--- /dev/null
+++ b/CI/doc/customHelpwin.m
@@ -0,0 +1,188 @@
+function [success, html] = customHelpwin(topic,pagetitle,helptitle,varargin)
+%HELPWIN MATLAB file help displayed in a window
+% HELPWIN TOPIC displays the help text for the specified TOPIC inside a
+% window. Links are created to functions referenced in the 'See Also'
+% line of the help text.
+%
+% HELPWIN(HELP_STR,TITLE) displays the string HELP_STR in the help
+% window. HELP_STR may be passed in as a string with each line separated
+% by carriage returns, a column vector cell array of strings with each cell
+% (row) representing a line or as a string matrix with each row representing
+% a line. The optional string TITLE will appear in the title banner.
+%
+% HELPWIN({TITLE1 HELP_STR1;TITLE2 HELP_STR2;...},PAGE) displays one page
+% of multi-page help text. Note: this calling sequence is deprecated and
+% is provided only for compatibility with previous versions of HELPWIN.
+% The multi-page help text is passed in as a
+% cell array of strings or cells containing TITLE and HELP_STR pairs.
+% Each row of the multi-page help text cell array (dimensioned number of
+% pages by 2) consists of a title string paired with a string, cell array
+% or string matrix of help text. The second argument PAGE is a string
+% which must match one of the TITLE entries in the multi-page help text.
+% The matching TITLE represents the page that is to be displayed first.
+% If no second argument is given, the first page is displayed.
+%
+% HELPWIN displays the default topic list in a window.
+%
+% HELPWIN will be removed in a future release. Use DOC instead.
+%
+% See also HELP, DOC.
+
+% Copyright 1984-2020 The MathWorks, Inc.
+
+if nargout
+ success = true;
+end
+
+% Make sure that we can support the helpwin command on this platform.
+if ~usejava('mwt')
+ error(message('MATLAB:doc:UnsupportedPlatform',upper(mfilename)));
+end
+
+% This function has to support the old helpwin syntax, which
+% provides for three disparate cases.
+% Case 1: HELPWIN TOPIC, to display function or topic help (same as HELP function).
+% Case 2: HELPWIN(HELP_STR,TITLE), to display an arbitrary help string.
+% Case 3: HELPWIN({TITLE1 HELP_STR1;TITLE2 HELP_STR2;...},PAGE)
+% to display multi-page help.
+
+% Is this multi-page help text? (case 3 above)
+if nargin>0 && (iscell(topic) || isstring(topic)) && (size(topic,2) > 1)
+ if nargin < 2
+ pagetitle = '';
+ helptitle = '';
+ elseif nargin < 3
+ helptitle = pagetitle;
+ end
+ if nargin > 3
+ displayOption = varargin{1};
+ else
+ displayOption = '';
+ end
+ handle_multipage_help(topic,pagetitle,helptitle,displayOption)
+ return;
+end
+
+if (nargin == 0)
+ doc;
+ return;
+elseif (nargin == 1)
+ html = help2html(topic);
+elseif (nargin > 1)
+ if nargin > 3
+ helpCommandOption = varargin{1};
+ else
+ helpCommandOption = '-helpwin';
+ end
+ html = help2html(topic,pagetitle,helpCommandOption);
+end
+
+if isempty(html) && nargout
+ success = false;
+ %{
+else
+ displayFile(['text://' html]);
+ %}
+end
+
+function handle_multipage_help(topic,pagetitle,helptitle,displayOption)
+if (iscell(topic) || isstring(topic)) && numel(topic) == 2
+ % This isn't really multipage help. Use a different helpwin syntax.
+ helpwin(topic{2},topic{1});
+ return;
+end
+
+pagetitle = char(pagetitle);
+helptitle = char(helptitle);
+
+% Alternate between multiple temp files (starting with matlabTemp1.html).
+% Multiple files are needed because a single file won't refresh properly,
+% and to allow for a certain level of "Back" operations in the browser.
+% You have to pass the browser a new file name each time to get it to reload.
+dirName = char(com.mathworks.services.Prefs.getPropertyDirectory);
+currFile = char(com.mathworks.mlservices.MLHelpServices.getCurrentLocation);
+tempNum = regexp(currFile,'matlabTemp(\d).html','tokens','once');
+if ~isempty(tempNum)
+ tempNum = rem(str2double(tempNum),5) + 1;
+else
+ tempNum = 1;
+end
+fileName = fullfile(dirName,['matlabTemp' num2str(tempNum) '.html']);
+
+% Workaround for ICE bug involving named anchors
+fnPos = strfind(fileName, 'matlabTemp');
+shortName = fileName(fnPos:length(fileName));
+
+% Starting building HTML output, beginning with optional title banner.
+% At top put header with links to each page.
+% Only show header if more than one page.
+dom = com.mathworks.xml.XMLUtils.createDocument('help-info');
+dom.getDomConfig.setParameter('cdata-sections',true);
+addTextNode(dom,dom.getDocumentElement,'title',helptitle);
+addTextNode(dom,dom.getDocumentElement,'filename',shortName);
+
+helpdir = fileparts(mfilename('fullpath'));
+helpdir = ['file:///' strrep(helpdir,'\','/')];
+addTextNode(dom,dom.getDocumentElement,'helptools-dir',helpdir);
+
+if ~strcmp(helptitle,pagetitle)
+ addTextNode(dom,dom.getDocumentElement,'pagetitle',pagetitle);
+end
+numpages = size(topic,1);
+for x = 1:numpages
+ pgtitle = char(topic(x,1));
+ helpNode = help2xml(dom,pgtitle,pgtitle,'-helpwin');
+ addAttribute(dom,helpNode,'id',num2str(x));
+end
+
+addTextNode(dom,dom.getDocumentElement,'default-topics-text',getString(message('MATLAB:helpwin:sprintf_DefaultTopics')));
+addTextNode(dom,dom.getDocumentElement,'help-command-option','helpwin');
+xslfile = fullfile(fileparts(mfilename('fullpath')),'private','helpwin.xsl');
+html = xslt(dom,xslfile,'-tostring');
+
+for x = 1:numpages
+ helpstr = char(topic(x,2));
+ if (size(helpstr,1) > 1)
+ % Convert a 2-D char array to 1-D.
+ c = cellstr(helpstr);
+ helpstr = sprintf('%s\n',c{:});
+ end
+
+ html = regexprep(html,['\s*'], sprintf('\n\n%s',regexptranslate('escape',helpstr)));
+end
+
+if strcmp(displayOption,'-nofile')
+ displayFile(['text://' html]);
+else
+ fid = fopen(fileName,'w');
+ fprintf(fid,'%s', html);
+ fclose(fid);
+
+ % Get the index for the requested page from the cell array.
+ % Display the appropriate page.
+ ind = strmatch(pagetitle,topic(:,1),'exact');
+ if isempty(ind), ind = 1; end
+ if ind == 1
+ displayFile(fileName);
+ else
+ namedAnchor = sprintf('#topic%u',ind);
+ displayFile([fileName namedAnchor ]);
+ end
+end
+
+function addTextNode(dom,parent,name,text)
+child = dom.createElement(name);
+child.appendChild(dom.createTextNode(text));
+parent.appendChild(child);
+
+function addAttribute(dom,elt,name,text)
+att = dom.createAttribute(name);
+att.appendChild(dom.createTextNode(text));
+elt.getAttributes.setNamedItem(att);
+
+
+%------------------------------------------
+% Helper function that displays the HTML file in the web browser.
+function displayFile(htmlFile)
+web(htmlFile, '-helpbrowser');
+
diff --git a/CI/doc/genhtml.m b/CI/doc/genhtml.m
new file mode 100644
index 0000000..76c34bd
--- /dev/null
+++ b/CI/doc/genhtml.m
@@ -0,0 +1,43 @@
+mfiledir = '..\..\+adi\';
+docdir = '..\..\doc\';
+parts = {'AD4630','AD4030','AD463x','AD7768'};
+trx_files = {'Rx','Base','Tx'};
+for ii = 1:numel(parts)
+ for jj = 1:numel(trx_files)
+ dotmfilename = strcat(mfiledir, '+', parts{ii}, '\', trx_files{jj}, '.m');
+ if isfile(dotmfilename)
+ htmlfilename = strcat(docdir, parts{ii}, '_', trx_files{jj}, '.html');
+ html = customDoc(dotmfilename);
+ dlmwrite(htmlfilename, html, 'delimiter', '');
+ use_local_css(htmlfilename)
+ disp(htmlfilename);
+ end
+ end
+end
+publish('SysObjsProps.m','outputDir','..\..\doc');
+publish('ADITTBHome.m','outputDir','..\..\doc');
+
+%{
+[filepath,name,ext] = fileparts(mfilename('fullpath'));
+cd(filepath);
+files = dir(filepath);
+
+target = '../../doc/';
+
+skip = {'NA'};
+
+for f = {files.name}
+ if strfind(f{:},'.mlx')>=0
+ filename = f{:};
+ if contains(filename,skip)
+ continue;
+ end
+ htmlFilename = [filename(1:end-4),'.html'];
+ disp(htmlFilename);
+ matlab.internal.liveeditor.openAndConvert(filename,htmlFilename);
+ movefile(htmlFilename,target);
+ end
+end
+%}
+
+
diff --git a/CI/doc/use_local_css.m b/CI/doc/use_local_css.m
new file mode 100644
index 0000000..364780e
--- /dev/null
+++ b/CI/doc/use_local_css.m
@@ -0,0 +1,10 @@
+function use_local_css(html_file)
+ url_str = 'https://localhost:31515/static/help/includes/product/css/';
+ contents = fileread(html_file);
+ str_loc = strfind(contents, url_str);
+ contents(str_loc:str_loc+numel(url_str)-1) = [];
+
+ fid = fopen(html_file,'w');
+ fprintf(fid, '%s', contents);
+ fclose(fid);
+end
\ No newline at end of file
diff --git a/CI/gen_doc/Makefile b/CI/gen_doc/Makefile
new file mode 100644
index 0000000..7ea2811
--- /dev/null
+++ b/CI/gen_doc/Makefile
@@ -0,0 +1,65 @@
+# Usage:
+# make MLRELEASE= HDLBRANCH=
+# Example
+# make build MLRELEASE=R2018b HDLBRANCH=hdl_2018_r1
+
+SHELL := /bin/bash
+
+MLFLAGS := -nodisplay -nodesktop -nosplash
+
+ifeq ($(MLRELEASE),)
+MLRELEASE := R2021a
+endif
+
+ifeq ($(HDLBRANCH),)
+HDLBRANCH := hdl_2018_r2
+endif
+
+ifeq ($(OS),Windows_NT)
+MLPATH := /cygdrive/c/Program\ Files/MATLAB
+MLFLAGS := $(MLFLAGS) -wait
+else
+UNAME_S := $(shell uname -s)
+ifeq ($(UNAME_S),Linux)
+MLPATH := /usr/local/MATLAB
+endif
+ifeq ($(UNAME_S),Darwin)
+MLPATH := /Applications
+MLRELEASE := MATLAB_${MLRELEASE}.app
+endif
+endif
+
+ifeq ($(BOARD),)
+BOARD :=
+endif
+
+ifeq ($(INCLUDE_EXAMPLES),)
+INCLUDE_EXAMPLES := 1
+endif
+
+GITTAG := $(shell git describe --tags HEAD)
+
+.PHONY: doc
+
+.ONESHELL:
+
+doc_ml:
+ cd ../.. ; \
+ cd docs ; \
+ cp ../../scripts/ports.json . ; \
+ cp ../../scripts/read_ports_json.py . ; \
+ python3 read_ports_json.py ; \
+ MATLAB=ON python3 gen_all_doc.py ; \
+ cd .. ; \
+ mkdocs build -d doc
+
+doc:
+ cd docs ; \
+ # cp ../../scripts/ports.json . ; \
+ # cp ../../scripts/read_ports_json.py . ; \
+ python3 read_ports_json.py ; \
+ python3 gen_all_doc.py ; \
+ cd .. ; \
+ mkdocs build -d doc ; \
+ mkdir -p ../../doc ; \
+ cp -r doc/* ../../doc/ ; \
diff --git a/CI/gen_doc/docs/_pages/examples.md b/CI/gen_doc/docs/_pages/examples.md
new file mode 100644
index 0000000..80daac3
--- /dev/null
+++ b/CI/gen_doc/docs/_pages/examples.md
@@ -0,0 +1,13 @@
+{% include 'header.tmpl' %}
+# Examples
+
+Examples for streaming data are listed within the Toolbox documentation itself. To view run the following with MATLAB:
+
+```
+doc adi
+```
+
+They can also be viewed on GitHub:
+
+ - [Streaming examples](https://github.com/analogdevicesinc/PrecisionToolbox/tree/master/examples)
+
diff --git a/CI/gen_doc/docs/_pages/header.tmpl b/CI/gen_doc/docs/_pages/header.tmpl
new file mode 100644
index 0000000..1ded747
--- /dev/null
+++ b/CI/gen_doc/docs/_pages/header.tmpl
@@ -0,0 +1,7 @@
+{%- if disable_nav -%}
+---
+hide:
+ - navigation
+ - toc
+---
+{%- endif -%}
\ No newline at end of file
diff --git a/CI/gen_doc/docs/_pages/index.md b/CI/gen_doc/docs/_pages/index.md
new file mode 100644
index 0000000..b35e436
--- /dev/null
+++ b/CI/gen_doc/docs/_pages/index.md
@@ -0,0 +1,35 @@
+{% include 'header.tmpl' %}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ADI maintains a set of tools to interface with ADI precision converters within MATLAB and Simulink. These are combined into a single toolbox. The list of supported parts is provided below.
+
+The following have device-specific implementations in MATLAB and Simulink. If a device has an IIO driver, MATLAB support is possible, but a device-specific MATLAB or Simulink interface may not exist yet.
+
+| Evaluation Card | FPGA Board | Streaming Support | Targeting | Variants and Minimum Supported Release |
+| --------- | --------- | --------- | --------- | --------- |
+| AD7380 | Zedboard | Yes | No | ADI (2021b) |
+| AD7768 | Zedboard | Yes | No | ADI (2021b) |
+| AD7768-1 | Zedboard | Yes | No | ADI (2021b) |
+| AD4030-24 | Zedboard | Yes | No | ADI (2021b) |
+| AD4630-16 | Zedboard | Yes | No | ADI (2021b) |
+| AD4630-24 | Zedboard | Yes | No | ADI (2021b) |
diff --git a/CI/gen_doc/docs/_pages/install.md b/CI/gen_doc/docs/_pages/install.md
new file mode 100644
index 0000000..3b08137
--- /dev/null
+++ b/CI/gen_doc/docs/_pages/install.md
@@ -0,0 +1,43 @@
+{% include 'header.tmpl' %}
+# Installation
+
+## Dependencies
+
+The toolbox has different dependencies based on the features required. The base dependencies for streaming data are listed below.
+
+
+### Data Streaming with Hardware
+
+The base dependencies for the toolbox requires libiio and the libiio MATLAB bindings. There are three options for this install with different required MathWorks Toolboxes:
+
+- [Communications Toolbox Support Package for Xilinx Zynq-Based Radio](https://www.mathworks.com/help/supportpkg/xilinxzynqbasedradio/index.html)
+ - Communications Toolbox
+ - Signal Processing ToolboxTM
+ - DSP System ToolboxTM
+- [Communications Toolbox Support Package for Analog Devices ADALM-Pluto Radio](https://www.mathworks.com/help/supportpkg/plutoradio/index.html)
+ - Communications Toolbox
+ - Signal Processing ToolboxTM
+ - DSP System ToolboxTM
+- [libiio MATLAB Binding Standalone Installer (R2021b+)](https://github.com/mathworks/buildroot/releases/download/mathworks_zynq_R21.2.0/libiio.mlpkginstall)
+ - Signal Processing ToolboxTM
+
+
+## Precision Toolbox Install
+
+The Precision Toolbox itself can be installed either from:
+
+- [MATLAB's Add-On Explorer](https://www.mathworks.com/products/matlab/add-on-explorer.html)
+- [GitHub Releases page](https://github.com/analogdevicesinc/PrecisionToolbox/releases).
+
+!!! warning "MATLAB Versions"
+ Before installing Precision Toolbox check the [Release Page](https://github.com/analogdevicesinc/PrecisionToolbox/releases) to check for the latest supported version of MATLAB. The latest version is the one which is available in [Add-on Explorer](https://www.mathworks.com/products/matlab/add-on-explorer.html), since Add-On Explorer does not currently support hosting multiple versions. If you have an older release of MATLAB, download the MLTBX installer from matching release on the [Release Page](https://github.com/analogdevicesinc/PrecisionToolbox/releases).
+
+
+### Add-On Explorer Walkthrough
+
+To install the toolbox from within MATLAB using the Add-On Explorer:
+
+ - Launch the Add-Ons Explorer from MATLAB's Home tab
+ - Search for 'Precision Toolbox'
+ - Select Precision Toolbox from Analog Devices, Inc. from the results:
+ - Install the toolbox
diff --git a/CI/gen_doc/docs/_pages/limitations.md b/CI/gen_doc/docs/_pages/limitations.md
new file mode 100644
index 0000000..c70441f
--- /dev/null
+++ b/CI/gen_doc/docs/_pages/limitations.md
@@ -0,0 +1,27 @@
+{% include 'header.tmpl' %}
+# Known Limitations, Bugs and Quirks
+
+Some limitations and bugs are known to be present in the support for the ADCs relevant to the Precision Toolbox. They have been summarized below.
+
+## Libiio backend
+
+Currently only ethernet/IP backends are supported for all the parts in the toolbox. For AD4030-24, AD4630-16 and AD4630-24 the usb backend can also be used. Serial backends are not supported.
+
+## AD7380
+
+Trigger setup needs to be done before running any of the toolbox scripts that interact with the AD7380. Refer to the [Trigger Management section on the AD738x Linux IIO driver wiki page](https://wiki.analog.com/resources/tools-software/linux-drivers/iio-adc/ad738x#trigger_management)
+
+## AD7768
+
+The Linux IIO driver for the AD7768 returns data for all the channels whenever a data capture is requested. So, in order to get sensible outputs, ensure that the EnabledChannels array consists of indices for all the channels.
+
+## AD4030-24. AD4630-16, AD4630-24
+
+The Linux IIO driver for the three parts (there's a common Linux driver that addresses all three parts) returns data for all the channels whenever a data capture is requested. In order to have sensible outputs, ensure that the EnabledChannels array consists of indices for all the channels.
+
+Another known issue here has to do with the case where the ADC sends out common mode voltage data along with the differential voltage data. The EnabledChannel property values that consist of more than two indices (even when there are 4 IIO channels), are not 'valid'. Of the possible groupings with two channel indices, the ones that correspond to {differential0, common_voltage0} and {differential1, common_voltage1} are also not 'valid'
+
+It is possible to get data (common-mode and differential) for all the ADC channels, by using a 'valid' channel grouping, setting the BufferTypeConversionEnable property to 'false' in the Base class for the AD463x family, and adding custom parsing logic to extract the data for all IIO channels, from the 32-bit raw words you get from the data capture.
+
+
+
diff --git a/CI/gen_doc/docs/_pages/models.md b/CI/gen_doc/docs/_pages/models.md
new file mode 100644
index 0000000..3af312e
--- /dev/null
+++ b/CI/gen_doc/docs/_pages/models.md
@@ -0,0 +1,8 @@
+{% include 'header.tmpl' %}
+# Behavioral Models
+
+
+The toolbox contains behavioral simulation models of different data converters that can be used in MATLAB and Simulink. These are designed to help users understand device limitations and advanced feature sets. As well as to test their algorithms and signal processing against.
+The currently supported behavioral models are:
+
+- [AD9081 MxFE Quad, 16-Bit, 12GSPS RFDAC and Quad, 12-Bit, 4GSPS RFADC](/models/ad9081/top_level.tex/)
\ No newline at end of file
diff --git a/CI/gen_doc/docs/_pages/streaming.md b/CI/gen_doc/docs/_pages/streaming.md
new file mode 100644
index 0000000..41a6bb9
--- /dev/null
+++ b/CI/gen_doc/docs/_pages/streaming.md
@@ -0,0 +1,90 @@
+{% include 'header.tmpl' %}
+# Receiving and Sending Data
+
+Remote data streaming to and from hardware is made available through [system object interfaces](https://www.mathworks.com/help/matlab/matlab_prog/what-are-system-objects.html), which are unique for each component or platform. The hardware interfacing system objects provide a since class to both configure a given platform and move data back and forth from the device.
+
+Command and control of hardware from MATLAB is accomplished by leveraging the [IIO drivers](https://wiki.analog.com/software/linux/docs/iio/iio) built into the target platform's kernel and [libiio](https://wiki.analog.com/resources/tools-software/linux-software/libiio) which provides remote backends to control drivers across different backends. Backends can be Ethernet/IP/USB based. Below is a diagram of the different components in the stack for a setup targeting the evaluation of the AD7380, but the setup will be nearly similar for other ADCs as well.
+
+
+
+Since libiio is cross-platform it can be used from Windows, Linux, or macOS based systems. It is also a lower level library independent of MATLAB, so when moving toward production or untethered systems similar APIs that are used in MATLAB can be used in C,C++,Python, or other languages.
+
+## Connecting and Configuration
+
+Connecting to hardware is done by setting the **uri** property of the system object interface. The **uri** for libiio always has the convention "*< backend >:< address >*", where *backend* can be ethernet, ip or usb. *address* will be specific to the backend. This is documented in the [libiio API](https://analogdevicesinc.github.io/libiio/master/libiio/group__Context.html#gafdcee40508700fa395370b6c636e16fe).
+
+Below is a basic example of setting up a generic ADC using an Ethernet/IP backend:
+```linenums="1"
+rx = adi.ADxxxx.Rx;
+rx.uri = 'ip:analog.local';
+data = rx();
+```
+With the code above, the hardware is not contacted until the operator or step method is called on line 3. Therefore, any properties that are set or defined before line 3 are not applied or updated on the hardware until after line 3. However, after line 3 has completed the object will become locked and certain configuration changes cannot be applied after this point. These will primarily sample rates and buffer sizes.
+
+The state of the object follows the flow of the diagram below triggered by line 3 above.
+
+``` mermaid
+graph LR
+ Z[Operator Called] -->A;
+ A[Connect To Board] --> B[Update Properties];
+ B --> C[Initialize Buffers];
+ C --> D[Send or Receive Data];
+ D --> E[Lock Object];
+```
+Once the object becomes locked it must be released if the sample rate or buffers need to be modified. This will disconnect from the hardware:
+```
+rx.release(); % Release object
+```
+
+To provide a complete example we can do more advanced configuration like so to demonstrate property changes:
+```linenums="1"
+rx = adi.ADxxxx.Rx;
+rx.uri = 'ip:analog.local';
+rx.SamplesPerFrame = 1024;
+rx.SampleRate = 256000;
+data1 = rx();
+
+% Update tunable property
+rx.SampleRate = 128000;
+data2 = rx();
+
+% Update non-tunable property
+rx.release();
+rx.SamplesPerFrame = 4096;
+dataLargerBuffer = rx();
+```
+
+## Receiving Data
+
+To receive or capture data from a given device first you must instantiate that device's interface class. For a generic ADC, this would be as follows:
+
+```
+rx = adi.ADxxxx.Rx;
+```
+
+Once instantiated you can configure the number of samples to be captured by setting the property **SamplesPerFrame.**
+
+```
+rx.SamplesPerFrame = 1e6;
+```
+
+**SamplesPerFrame** is the number of samples per channel which will be captured. If your device produces complex data (I and Q) this is the number of complex samples. There will be a limit to the maximum samples which can be collected. By default this is set to 2^20, but it may be possible to make it larger depending on hardware. Once the operator methods are used for a give instantiation, the object will become locked and the **SamplesPerFrame** property cannot be changed. This is known as a non-tunable property.
+
+To actually collect the samples or perform the capture, the operator of the system object should be used or the **step** method as so:
+
+```
+data = rx(); % Operator method
+data = rx.step(); % Step method
+```
+
+Both method calls are equivalent, and the produced matrix **data** will be of size [SamplesPerFrame x length(EnabledChannels)]. **EnabledChannels** determines the channels which data will be collected from. **EnabledChannels** is a [1xN] vector with indexes starting at 1 of the desired channels.
+
+## Continuous Data Acquisition
+
+If you are capturing multiple frames or buffers of data, then there might arise situations where discontinuities appear in the samples, when plotted.
+
+Some detail and tips are discussed in this wiki page on [IIO System Considerations, Tips and Tricks](https://wiki.analog.com/resources/tools-software/linux-software/libiio_tips_tricks)
+
+The IIO buffer size is governed by the SamplesPerFrame property of the System Object classes. The kernelBuffersCount is also a property defined for the classes, and can be modified.
+
+
diff --git a/CI/gen_doc/docs/_pages/support.md b/CI/gen_doc/docs/_pages/support.md
new file mode 100644
index 0000000..6982a8f
--- /dev/null
+++ b/CI/gen_doc/docs/_pages/support.md
@@ -0,0 +1,9 @@
+{% include 'header.tmpl' %}
+# Support
+
+Support is provided online through the EngineerZone forums. If you have questions related to the hardware itself outside of this BSP, contact your local FAE or ask on the forums.
+
+Question regarding specific aspect of the BSP should be asked in the following places:
+
+- [**Software Interface Tools**](https://ez.analog.com/sw-interface-tools/f/q-a) for questions on the BSP itself
+- [**Linux Software Drivers**](https://ez.analog.com/linux-software-drivers/f/q-a) for libiio and iio driver questions
\ No newline at end of file
diff --git a/CI/gen_doc/docs/_pages/targeting.md b/CI/gen_doc/docs/_pages/targeting.md
new file mode 100644
index 0000000..eaa4c80
--- /dev/null
+++ b/CI/gen_doc/docs/_pages/targeting.md
@@ -0,0 +1,57 @@
+
+# HDL Targeting with HDL-Coder
+
+High-Speed Converter Toolbox supports the IP Core generation flow from MathWorks which allows for automated integration of DSP into HDL reference designs from Analog Devices. This workflow will take Simulink subsystems, run HDL-Coder to generate source Verilog, and then integrate that into a larger reference design. The figure below is a simplified block diagram of a SoC (Fabric+ARM) device, where specialized IP are inserted into the receive and transmit datapaths. This is supported on specific FPGA families and high-speed based reference designs. This support is based on the Zynq HDL-Coder and support
+
+
+
+## Recommended Review
+
+- [Getting started with Zynq](https://www.mathworks.com/support/search.html/videos/getting-started-with-zynq-80338.html?fq%5B%5D=asset_type_name:video&fq%5B%5D=category:hdlcoder/index&page=1)
+
+## Getting Started
+
+To perform targeting will require FPGA vendor tools for the FPGA system. For Xilinx this will be Vivado and the toolbox will require specific versions for each release. For the current release this is Vivado 2019.1. Using other versions are not supported. To build the necessary BOOT.BIN files will require the Xilinx SDK as well.
+
+Once you have the installed the necessary 3rd party tools MATLAB needs to be told where they are installed by use of the [hdlsetuptoolpath](https://www.mathworks.com/help/hdlcoder/ref/hdlsetuptoolpath.html) command. For Windows the following MATLAB command can be used:
+
+```matlab
+hdlsetuptoolpath('ToolName', 'Xilinx Vivado', 'ToolPath', 'C:\Xilinx\Vivado\2019.1\bin\vivado.bat');
+```
+
+or Linux:
+
+```matlab
+hdlsetuptoolpath('ToolName', 'Xilinx Vivado', 'ToolPath', '/opt/Xilinx/Vivado/2019.1/bin/vivado');
+```
+
+Please change the tool path if it is different on your system.
+
+### Checking For Supported Designs
+
+To verify that the ADI reference designs are available to [HDL Workflow Advisor](https://www.mathworks.com/help/hdlcoder/ug/overview-of-workflows-in-hdl-workflow-advisor.html) a Simulink model needs to be opened. To do so launch Simulink with the following command:
+
+```matlab
+simulink
+```
+
+After it launches open a "Blank DUT" model from the "HDL Coder" dropdown of the Simulink Start Page.
+
+
+
+
+After the model opens, click on the green subsystem to select it. Then open the "Apps" tap, open the apps menu and
+scroll down to HDL-Coder.
+
+
+
+
+This will open the HDL-Coder menu, from here the Workflow Advisor is selectable. Click on it to launch the advisor.
+
+
+
+
+Once launch go to Step 1.1 on the left side column. Then on the right side of the window select "IP Core Generation" for "Target workflow". Then the ADI reference designs should be available in the "Target platform" menu as so:
+
+
+
\ No newline at end of file
diff --git a/CI/gen_doc/docs/_pages/toc.tmpl b/CI/gen_doc/docs/_pages/toc.tmpl
new file mode 100644
index 0000000..78e9a19
--- /dev/null
+++ b/CI/gen_doc/docs/_pages/toc.tmpl
@@ -0,0 +1,14 @@
+
+
+ Analog Devices, Inc Precision Toolbox
+{%- for page in pages %}
+ {{ page|capitalize }}
+{%- endfor %}
+
+ Hardware Interface APIs
+{%- for obj in devices %}
+ {{ obj }}
+{%- endfor %}
+
+
+
diff --git a/CI/gen_doc/docs/_templates/allsysobjs.tmpl b/CI/gen_doc/docs/_templates/allsysobjs.tmpl
new file mode 100644
index 0000000..c21ef46
--- /dev/null
+++ b/CI/gen_doc/docs/_templates/allsysobjs.tmpl
@@ -0,0 +1,12 @@
+{% include 'header.tmpl' %}
+# Hardware Interface APIs
+
+Available hardware streaming interfaces in PCX Toolbox:
+
+{%- for obj in devices %}
+- {{ obj }}
+{%- endfor %}
+
+Click on left table of contents for individual component pages.
\ No newline at end of file
diff --git a/CI/gen_doc/docs/_templates/header.tmpl b/CI/gen_doc/docs/_templates/header.tmpl
new file mode 100644
index 0000000..1ded747
--- /dev/null
+++ b/CI/gen_doc/docs/_templates/header.tmpl
@@ -0,0 +1,7 @@
+{%- if disable_nav -%}
+---
+hide:
+ - navigation
+ - toc
+---
+{%- endif -%}
\ No newline at end of file
diff --git a/CI/gen_doc/docs/_templates/mkdocs.tmpl b/CI/gen_doc/docs/_templates/mkdocs.tmpl
new file mode 100644
index 0000000..43d3ba5
--- /dev/null
+++ b/CI/gen_doc/docs/_templates/mkdocs.tmpl
@@ -0,0 +1,62 @@
+site_name: Analog Devices, Inc. Precision Toolbox
+
+theme:
+ logo: assets/matlab_white_icon.svg
+ name: material
+ palette:
+ - scheme: default
+ primary: blue
+
+ - scheme: slate
+ primary: blue
+ toggle:
+ icon: material/toggle-switch
+ name: Switch to light mode
+
+nav:
+ - Overview: index.md
+ - Installation: install.md
+ - Data Streaming: streaming.md
+ - Examples: examples.md
+ - Support: support.md
+{%- if matlab %}
+ - Hardware Interface APIs: objects.md
+{%- endif %}
+ - Reference API:
+ - Device Interfaces:
+{%- for dev in devices %}
+ - {{ dev }}: {{ devices[dev] }}
+{%- endfor %}
+
+
+extra_css:
+ - stylesheets/style.css
+ - stylesheets/rd_style.css
+{%- if matlab %}
+ - stylesheets/ml_style.css
+{%- endif %}
+
+extra_javascript:
+ - js/sys_objects.js
+
+plugins:
+ - search
+ - awesome-pages
+ - mermaid2
+ - inline-svg
+
+markdown_extensions:
+ - attr_list
+ - md_in_html
+ - admonition
+ - pymdownx.details
+ - pymdownx.highlight:
+ anchor_linenums: true
+ - pymdownx.inlinehilite
+ - pymdownx.snippets
+ - pymdownx.superfences:
+ # make exceptions to highlighting of code:
+ custom_fences:
+ - name: mermaid
+ class: mermaid
+ format: !!python/name:mermaid2.fence_mermaid
\ No newline at end of file
diff --git a/CI/gen_doc/docs/_templates/refdesign.html b/CI/gen_doc/docs/_templates/refdesign.html
new file mode 100644
index 0000000..05e225d
--- /dev/null
+++ b/CI/gen_doc/docs/_templates/refdesign.html
@@ -0,0 +1,47 @@
+{% include 'header.tmpl' %}
+{% block content %}
+
+# {{ obj.name }} Reference Design Integration
+
+This page outlines the HDL reference design integration for the *{{ obj.name }}* reference design for the Analog Devices
+{{ obj.chip }} component. The IP-Core Generation follow is available on the based on the following base HDL reference design for the following board and design variants:
+
+- [Base reference design documentation]({{ obj.hdl_rd_doc }})
+- Supported FPGA carriers:
+{%- for carrier in obj.fpga %}
+ - {{ carrier.upper() }}
+{%- endfor %}
+- Supported design variants:
+{%- for supported_rd in obj.supported_rd %}
+ - {{ supported_rd.upper() }}
+{%- endfor %}
+
+## Reference Design
+
+
+ {% if obj.rd_image == "ad9361" %}
+ 
+ {% elif obj.rd_image == "adrv9001" %}
+ 
+ {% elif obj.rd_image == "jesd" %}
+ 
+ {% endif %}
+ HDL Reference Design with Custom IP from HDL-Coder. Click on sub-blocks for more documentation.
+
+The IP-Core generation flow will integrate IP generated from Simulink subsystem into an ADI authored reference design. Depending on the FPGA carrier and FMC card or SoM, this will support different IP locations based on the diagram above.
+
+## HDL Worflow Advisor Port Mappings
+
+When using the HDL Worflow Advisor, the following port mappings are used to connect the reference design to the HDL-Coder generated IP-Core:
+
+| Type | Target Platform Interface (MATLAB) | Reference Design Connection (Vivado) | Width | Reference Design Variant |
+| ---- | ------------------------ | --------------------------- | ----- | ----------- |
+{%- for rds in obj.ports[0] %}
+
+{%- for rd in obj.ports[0][rds] %}
+| {{ rd['type'].upper() }}-{% if rd['input'] == "true" %}IN{% else %}OUT{% endif %} | {{ rd['m_name'] }} | {{ rd['name'] }} | {{ rd['width'] }} | {{ rds.upper() }} |
+{%- endfor %}
+
+{%- endfor %}
+
+{% endblock %}
diff --git a/CI/gen_doc/docs/_templates/sysobj.html b/CI/gen_doc/docs/_templates/sysobj.html
new file mode 100644
index 0000000..19c8120
--- /dev/null
+++ b/CI/gen_doc/docs/_templates/sysobj.html
@@ -0,0 +1,94 @@
+{% include 'header.tmpl' %}
+{% block content %}
+
+
+
+
+
+
+
+
+{{ obj.dec }}
+
+
+
+
+
Creation
+
+The class can be instantiated in the following way with and without property name value pairs.
+
+```matlab
+dev = {{ obj.name }}
+dev = {{ obj.name }}(Name, Value)
+```
+
+
Properties
+
+
+
+Unless otherwise indicated, properties are non-tunable, which means you cannot change their values after calling the object. Objects lock when you call them, and the release function unlocks them.
+
+If a property is tunable, you can change its value at any time.
+
+
+```
+{% if obj.type == "Tx" %}
+%% Configure device
+tx = {{ obj.name }};
+tx.uri = "ip:analog.local";
+tx.DataSource = 'DMA';
+tx.EnableCyclicBuffers = true;
+tx.EnabledChannels = 1;
+
+%% Generate tone
+amplitude = 2^15; frequency = 0.12e6;
+swv1 = dsp.SineWave(amplitude, frequency);
+{% if obj.name == "adi.AD9081.Tx" or obj.name == "adi.AD9081.Rx" -%}
+swv1.ComplexOutput = true;
+{% endif -%}
+swv1.SamplesPerFrame = 2^14;
+{% if (obj.name == "adi.AD9081.Tx") or (obj.name == "adi.AD9081.Rx") -%}
+swv1.SampleRate = 250e6;
+{% else %}
+swv1.SampleRate = tx.SamplingRate;
+{% endif -%}
+y = swv1();
+
+%% Send
+tx(y);
+{% else %}
+%% Rx set up
+rx = {{ obj.name }}('uri','ip:analog.local');
+rx.SamplesPerFrame = 2^14;
+rx.EnabledChannels = 1;
+
+%% Run
+for k=1:10
+ valid = false;
+ while ~valid
+ [out, valid] = rx();
+ end
+end
+
+%% Cleanup
+release(rx)
+{% endif %}
+```
\ No newline at end of file
diff --git a/CI/gen_doc/docs/assets/MATLAB_HDL_Ref_Design.png b/CI/gen_doc/docs/assets/MATLAB_HDL_Ref_Design.png
new file mode 100644
index 0000000..e146e59
Binary files /dev/null and b/CI/gen_doc/docs/assets/MATLAB_HDL_Ref_Design.png differ
diff --git a/CI/gen_doc/docs/assets/MATLAB_libiio_Stack.png b/CI/gen_doc/docs/assets/MATLAB_libiio_Stack.png
new file mode 100644
index 0000000..1788194
Binary files /dev/null and b/CI/gen_doc/docs/assets/MATLAB_libiio_Stack.png differ
diff --git a/CI/gen_doc/docs/assets/PCXEvalStack.PNG b/CI/gen_doc/docs/assets/PCXEvalStack.PNG
new file mode 100644
index 0000000..bfa091d
Binary files /dev/null and b/CI/gen_doc/docs/assets/PCXEvalStack.PNG differ
diff --git a/CI/gen_doc/docs/assets/PCXTlbx_Image.PNG b/CI/gen_doc/docs/assets/PCXTlbx_Image.PNG
new file mode 100644
index 0000000..6a1884f
Binary files /dev/null and b/CI/gen_doc/docs/assets/PCXTlbx_Image.PNG differ
diff --git a/CI/gen_doc/docs/assets/PcxToolboxLogo.png b/CI/gen_doc/docs/assets/PcxToolboxLogo.png
new file mode 100644
index 0000000..5aa1c09
Binary files /dev/null and b/CI/gen_doc/docs/assets/PcxToolboxLogo.png differ
diff --git a/CI/gen_doc/docs/assets/Reference_Designs.fig b/CI/gen_doc/docs/assets/Reference_Designs.fig
new file mode 100644
index 0000000..a66e4f9
Binary files /dev/null and b/CI/gen_doc/docs/assets/Reference_Designs.fig differ
diff --git a/CI/gen_doc/docs/assets/add_ex.png b/CI/gen_doc/docs/assets/add_ex.png
new file mode 100644
index 0000000..6a3fa66
Binary files /dev/null and b/CI/gen_doc/docs/assets/add_ex.png differ
diff --git a/CI/gen_doc/docs/assets/addons_page.png b/CI/gen_doc/docs/assets/addons_page.png
new file mode 100644
index 0000000..8059a08
Binary files /dev/null and b/CI/gen_doc/docs/assets/addons_page.png differ
diff --git a/CI/gen_doc/docs/assets/addons_page_wbox.png b/CI/gen_doc/docs/assets/addons_page_wbox.png
new file mode 100644
index 0000000..8809e04
Binary files /dev/null and b/CI/gen_doc/docs/assets/addons_page_wbox.png differ
diff --git a/CI/gen_doc/docs/assets/hwa_11.png b/CI/gen_doc/docs/assets/hwa_11.png
new file mode 100644
index 0000000..2a133ed
Binary files /dev/null and b/CI/gen_doc/docs/assets/hwa_11.png differ
diff --git a/CI/gen_doc/docs/assets/hwa_11_crop.png b/CI/gen_doc/docs/assets/hwa_11_crop.png
new file mode 100644
index 0000000..7e9ab89
Binary files /dev/null and b/CI/gen_doc/docs/assets/hwa_11_crop.png differ
diff --git a/CI/gen_doc/docs/assets/matlab_white_icon.svg b/CI/gen_doc/docs/assets/matlab_white_icon.svg
new file mode 100644
index 0000000..354bad1
--- /dev/null
+++ b/CI/gen_doc/docs/assets/matlab_white_icon.svg
@@ -0,0 +1,16 @@
+
+
diff --git a/CI/gen_doc/docs/assets/rd_ad9361.svg b/CI/gen_doc/docs/assets/rd_ad9361.svg
new file mode 100644
index 0000000..d34a544
--- /dev/null
+++ b/CI/gen_doc/docs/assets/rd_ad9361.svg
@@ -0,0 +1,284 @@
+
diff --git a/CI/gen_doc/docs/assets/rd_ad9361_custom.svg b/CI/gen_doc/docs/assets/rd_ad9361_custom.svg
new file mode 100644
index 0000000..e964b9f
--- /dev/null
+++ b/CI/gen_doc/docs/assets/rd_ad9361_custom.svg
@@ -0,0 +1,284 @@
+
diff --git a/CI/gen_doc/docs/assets/rd_adrv9001.svg b/CI/gen_doc/docs/assets/rd_adrv9001.svg
new file mode 100644
index 0000000..f8a0ebd
--- /dev/null
+++ b/CI/gen_doc/docs/assets/rd_adrv9001.svg
@@ -0,0 +1,254 @@
+
diff --git a/CI/gen_doc/docs/assets/rd_adrv9001_custom.svg b/CI/gen_doc/docs/assets/rd_adrv9001_custom.svg
new file mode 100644
index 0000000..094b236
--- /dev/null
+++ b/CI/gen_doc/docs/assets/rd_adrv9001_custom.svg
@@ -0,0 +1,254 @@
+
diff --git a/CI/gen_doc/docs/assets/rd_jesd.svg b/CI/gen_doc/docs/assets/rd_jesd.svg
new file mode 100644
index 0000000..8beb0e2
--- /dev/null
+++ b/CI/gen_doc/docs/assets/rd_jesd.svg
@@ -0,0 +1,328 @@
+
diff --git a/CI/gen_doc/docs/assets/rd_jesd_custom.svg b/CI/gen_doc/docs/assets/rd_jesd_custom.svg
new file mode 100644
index 0000000..f33e590
--- /dev/null
+++ b/CI/gen_doc/docs/assets/rd_jesd_custom.svg
@@ -0,0 +1,328 @@
+
diff --git a/CI/gen_doc/docs/assets/simulink_blank_dut.png b/CI/gen_doc/docs/assets/simulink_blank_dut.png
new file mode 100644
index 0000000..35a9f7d
Binary files /dev/null and b/CI/gen_doc/docs/assets/simulink_blank_dut.png differ
diff --git a/CI/gen_doc/docs/assets/simulink_hdl_coder.png b/CI/gen_doc/docs/assets/simulink_hdl_coder.png
new file mode 100644
index 0000000..fabfba5
Binary files /dev/null and b/CI/gen_doc/docs/assets/simulink_hdl_coder.png differ
diff --git a/CI/gen_doc/docs/assets/simulink_new_model.png b/CI/gen_doc/docs/assets/simulink_new_model.png
new file mode 100644
index 0000000..8dc6059
Binary files /dev/null and b/CI/gen_doc/docs/assets/simulink_new_model.png differ
diff --git a/CI/gen_doc/docs/assets/simulink_wa.png b/CI/gen_doc/docs/assets/simulink_wa.png
new file mode 100644
index 0000000..1b4c44d
Binary files /dev/null and b/CI/gen_doc/docs/assets/simulink_wa.png differ
diff --git a/CI/gen_doc/docs/assets/trx_search.png b/CI/gen_doc/docs/assets/trx_search.png
new file mode 100644
index 0000000..53ae4cf
Binary files /dev/null and b/CI/gen_doc/docs/assets/trx_search.png differ
diff --git a/CI/gen_doc/docs/assets/trx_search_find.png b/CI/gen_doc/docs/assets/trx_search_find.png
new file mode 100644
index 0000000..5d17a84
Binary files /dev/null and b/CI/gen_doc/docs/assets/trx_search_find.png differ
diff --git a/CI/gen_doc/docs/assets/trx_search_find_wbox.png b/CI/gen_doc/docs/assets/trx_search_find_wbox.png
new file mode 100644
index 0000000..722ff1c
Binary files /dev/null and b/CI/gen_doc/docs/assets/trx_search_find_wbox.png differ
diff --git a/CI/gen_doc/docs/assets/trx_search_wbox.png b/CI/gen_doc/docs/assets/trx_search_wbox.png
new file mode 100644
index 0000000..0290229
Binary files /dev/null and b/CI/gen_doc/docs/assets/trx_search_wbox.png differ
diff --git a/CI/gen_doc/docs/gen_all_doc.py b/CI/gen_doc/docs/gen_all_doc.py
new file mode 100644
index 0000000..0ff1be8
--- /dev/null
+++ b/CI/gen_doc/docs/gen_all_doc.py
@@ -0,0 +1,10 @@
+from gen_md_pages import gen_pages_and_toc
+from gen_sysobj_pages import gen_sys_obj_pages
+from gen_rd_svg import gen_rd_svg
+import os
+
+if __name__ == "__main__":
+ gen_rd_svg()
+ matlab = bool(os.environ.get("MATLAB"))
+ devices, designs = gen_sys_obj_pages(matlab)
+ gen_pages_and_toc(matlab, devices, designs)
diff --git a/CI/gen_doc/docs/gen_hdl_refdesigns.py b/CI/gen_doc/docs/gen_hdl_refdesigns.py
new file mode 100644
index 0000000..74f8c07
--- /dev/null
+++ b/CI/gen_doc/docs/gen_hdl_refdesigns.py
@@ -0,0 +1,55 @@
+from jinja2 import Environment, FileSystemLoader
+import os
+import json
+import numpy as np
+
+
+def update_hdl_refdesigns():
+
+ template_filename = "refdesign.html"
+
+ # Data for template
+ f = open("ports.json")
+ objs = json.load(f)
+ f.close()
+
+ # Import template
+ loc = os.path.dirname(__file__)
+ loc = os.path.join(loc, "_templates")
+ file_loader = FileSystemLoader(loc)
+ env = Environment(loader=file_loader)
+
+ loc = os.path.join(template_filename)
+ template = env.get_template(loc)
+
+ designs = {}
+
+ for obj in objs:
+ # Render template
+ objs[obj]["name"] = obj
+
+ if objs[obj]["name"] in ["fmcomms2", "adrv9361z7035", "adrv9364z7020", "pluto"]:
+ objs[obj]["rd_image"] = "ad9361"
+ elif objs[obj]["name"] in ["adrv9002"]:
+ objs[obj]["rd_image"] = "adrv9001"
+ else:
+ objs[obj]["rd_image"] = "jesd"
+
+ output = template.render(obj=objs[obj])
+ # Write output
+ output_filename = f"hdlrefdesigns/{obj}.md"
+ loc = os.path.join(output_filename)
+ f = open(loc, "w")
+ f.write(output)
+ f.close()
+ designs[obj] = output_filename
+
+ # # Update mkdocs.yml
+ # loc = os.path.join("mkdocs.tmpl")
+ # template = env.get_template(loc)
+ # output = template.render(designs=designs)
+
+ # loc = os.path.join("..", "mkdocs.yml")
+ # with open(loc, "w") as f:
+ # f.write(output)
+ return designs
diff --git a/CI/gen_doc/docs/gen_md_pages.py b/CI/gen_doc/docs/gen_md_pages.py
new file mode 100644
index 0000000..9c72301
--- /dev/null
+++ b/CI/gen_doc/docs/gen_md_pages.py
@@ -0,0 +1,68 @@
+from jinja2 import Environment, FileSystemLoader
+import os
+from os import listdir
+
+# output_folder = "output"
+
+# if not os.path.exists(output_folder):
+# os.makedirs(output_folder)
+
+
+def gen_page(template_filename, disable_nav):
+ # Import template
+ loc = os.path.dirname(__file__)
+ loc = os.path.join(loc, "_pages")
+ print(loc)
+ file_loader = FileSystemLoader(loc)
+ env = Environment(loader=file_loader)
+
+ template = env.get_template(template_filename)
+
+ output = template.render(disable_nav=disable_nav)
+
+ with open(template_filename, "w") as f:
+ f.write(output)
+
+
+def gen_toc(pages, devices, designs):
+
+ # Ensure that install.md is the first item here
+ pages.remove("install")
+ pages.insert(0, "install")
+
+ # Import template
+ loc = os.path.dirname(__file__)
+ loc = os.path.join(loc, "_pages")
+ file_loader = FileSystemLoader(loc)
+ env = Environment(loader=file_loader)
+
+ template = env.get_template("toc.tmpl")
+
+ # Remove index from the list of pages -- otherwise it'll get added twice in the helptoc
+ pages.remove("index")
+ pages.remove("targeting")
+ pages.remove("models")
+ output = template.render(pages=pages, devices=devices, designs=designs)
+
+ loc = os.path.dirname(__file__)
+ loc = os.path.join(loc, "helptoc.xml")
+
+ with open(loc, "w") as f:
+ f.write(output)
+
+
+def gen_pages_and_toc(matlab, devices, designs):
+
+ template_filenames = listdir("_pages")
+
+ pages = []
+ for template_filename in template_filenames:
+ if matlab and template_filename == "models.md":
+ continue
+ if template_filename in ["header.tmpl", "toc.tmpl"]:
+ continue
+ gen_page(template_filename, matlab)
+ template_filename = template_filename.replace(".md", "")
+ pages.append(template_filename)
+
+ gen_toc(pages, devices, designs)
diff --git a/CI/gen_doc/docs/gen_rd_svg.py b/CI/gen_doc/docs/gen_rd_svg.py
new file mode 100644
index 0000000..8cb6f6b
--- /dev/null
+++ b/CI/gen_doc/docs/gen_rd_svg.py
@@ -0,0 +1,94 @@
+import os
+
+def gen_rd_svg():
+ refs = ["rd_ad9361","rd_adrv9001","rd_jesd"]
+ css_out = ""
+
+ for ref in refs:
+
+ with open(f"assets/{ref}.svg", "r") as f:
+ svg = f.read()
+
+ selectable_boxes = {
+ "AXIAD9361Box": {"link": "https://wiki.analog.com/resources/fpga/docs/axi_ad9361"},
+ "AXIADRV9002Box": {"link": "https://wiki.analog.com/resources/eval/user-guides/adrv9002/axi_adrv9002"},
+ "TxDMAEngineBox": {"link": "https://wiki.analog.com/resources/fpga/docs/axi_dmac"},
+ "TxUPACKBox": {"link": "https://wiki.analog.com/resources/fpga/docs/util_upack"},
+ "TxFIFOBox": {"link": "https://wiki.analog.com/resources/fpga/docs/util_rfifo"},
+ "RxDMAEngineBox": {"link": "https://wiki.analog.com/resources/fpga/docs/axi_dmac"},
+ "CPACKBox": {"link": "https://wiki.analog.com/resources/fpga/docs/util_cpack"},
+ "RxFIFOBox": {"link": "https://wiki.analog.com/resources/fpga/docs/util_rfifo"},
+ "RxJESDTPL": {"link": "https://wiki.analog.com/resources/fpga/peripherals/jesd204/jesd204_tpl_adc"},
+ "TxJESDTPL": {"link": "https://wiki.analog.com/resources/fpga/peripherals/jesd204/jesd204_tpl_dac"},
+ "RxJESDLink": {"link": "https://wiki.analog.com/resources/fpga/peripherals/jesd204/axi_jesd204_rx"},
+ "TxJESDLink": {"link": "https://wiki.analog.com/resources/fpga/peripherals/jesd204/axi_jesd204_tx"},
+ "RxJESDPHY": {"link": "https://wiki.analog.com/resources/fpga/docs/axi_adxcvr"},
+ "TxJESDPHY": {"link": "https://wiki.analog.com/resources/fpga/docs/axi_adxcvr"},
+ }
+
+
+ # "TxCustomIPBox",
+ # CarrierBox
+ # AXIInterconnectBox
+ # ZynqBox
+ # DDRxBox
+ # InterruptsBox
+ # UARTBox
+ # EthernetBox
+ # RxCustomIPBox
+ # CustomIPOutline
+
+
+ # Parse each g tag
+ output = ""
+ for i, sec in enumerate(svg.split("AXI-AD9361 Interface'
+ # css_out += '#AXIAD9361Interface {fill: none; stroke: none;}\n'
+
+ o = "") + 4
+ gtag = o[:loc]
+ post_gtag = o[loc:]
+ # print(gtag)
+ loc = gtag.find("id=") + 4
+ id = gtag[loc : gtag.find('"', loc)]
+ if id == "CarrierBox":
+ css_out += (
+ f"\n#{id} > rect {{\n"
+ + " fill: var(--md-default-fg-color--light);\n"
+ + "}\n"
+ )
+
+
+ if not id or id not in selectable_boxes:
+ output += o
+ continue
+ # Add link wrapper
+ output += f'{gtag}{post_gtag}'
+ # output += o
+ # print(sec)
+ # Add css to change fill color
+ css_out += f"#{id} > rect {{\n" + " stroke: white;\n" + "}\n"
+ css_out += f"\n#{id}:hover > rect {{\n" + " fill: rgb(0, 174, 255);\n" + "}\n"
+
+
+
+ with open(f"assets/{ref}_custom.svg", "w") as f:
+ f.write(output)
+
+ css_out += "\n#FPGACarrierText {\n" + " fill: var(--rd-title-color);\n" + "}\n"
+ css_out += "\n#CarrierBox > rect {\n" + " fill: none;\n stroke: black\n" + "}\n"
+ css_out += (
+ "\n#CustomIPOutline > rect {\n" + " stroke: var(--rd-title-color);\n" + "}\n"
+ )
+ css_out += ("\n#CustomIPIntegrationText {\n" + " fill: var(--rd-title-color);\n" + "}\n")
+
+ with open("stylesheets/rd_style.css", "w") as f:
+ f.write(css_out)
diff --git a/CI/gen_doc/docs/gen_sysobj_doc.m b/CI/gen_doc/docs/gen_sysobj_doc.m
new file mode 100644
index 0000000..480832e
--- /dev/null
+++ b/CI/gen_doc/docs/gen_sysobj_doc.m
@@ -0,0 +1,73 @@
+[filepath,name,ext] = fileparts(mfilename('fullpath'));
+cd(filepath);
+cd('..');
+files = dir(filepath);
+
+mfiledir = fullfile('adi');
+docdir = fullfile('doc');
+
+rootClasses = {...
+ {'AD7380',{'Rx'}}...
+ , {'AD7768', {'Rx'}}...
+ , {'AD7768_1', {'Rx'}}...
+ , {'AD4030', {'Rx'}}...
+ , {'AD4630_16', {'Rx'}}...
+ , {'AD4630_24', {'Rx'}}...
+ %{'QuadMxFE',{'Rx','Tx'}}...
+ };
+
+all_devs = [];
+for ii = 1:numel(rootClasses)
+ for jj = 1:numel(rootClasses{ii}{2})
+ part = rootClasses{ii}{1};
+ tmp = rootClasses{ii}{2};
+ trx_file = tmp{jj};
+ all_props = [];
+ dotmfilename = strcat(mfiledir, '.', part, '.', trx_file);
+ props = unique(properties(dotmfilename));
+ for prop = 1:length(props)
+
+ if props{prop} == "enIO"
+ continue;
+ end
+ pdoc = help(strcat(dotmfilename,'.',props{prop}));
+
+ pdocs = strsplit(pdoc,'\n');
+ prop_title = pdocs{1};
+ prop_description = strip(replace(strjoin(pdocs(2:end),'\n'),'\n',''));
+ prop_description = int32(prop_description);
+ prop_description(prop_description==10) = [];
+ prop_description(prop_description==13) = [];
+ prop_description = char(prop_description);
+ prop_description = replace(prop_description,' ',' ');
+ prop_description = replace(prop_description,' ',' ');
+
+ s = struct('prop_name',props{prop},...
+ 'prop_title',prop_title,...
+ 'prop_description',prop_description);
+ all_props = [all_props,s];
+ end
+ top_doc = help(dotmfilename);
+ top_doc = strsplit(top_doc,'\n');
+ top_doc = replace(top_doc,'\n',' ');
+ top_doc = strjoin(top_doc(2:end),' ');
+
+% top_doc = strip(replace(top_doc,'\n',''));
+% top_doc = int32(top_doc);
+% top_doc(top_doc==10) = [];
+% top_doc(top_doc==13) = [];
+% top_doc = char(top_doc);
+% top_doc = replace(top_doc,' ',' ');
+% top_doc = replace(top_doc,' ',' ');
+
+
+ oname = struct('name',dotmfilename, 'dec',top_doc, 'props',all_props);
+ all_devs = [all_devs, oname];
+ end
+end
+%%
+jsonText = jsonencode(all_devs,'PrettyPrint',true);
+fid = fopen('docs/sysobjs.json', 'w');
+fprintf(fid, '%s', jsonText);
+fclose(fid);
+
diff --git a/CI/gen_doc/docs/gen_sysobj_pages.py b/CI/gen_doc/docs/gen_sysobj_pages.py
new file mode 100644
index 0000000..0a6f96b
--- /dev/null
+++ b/CI/gen_doc/docs/gen_sysobj_pages.py
@@ -0,0 +1,89 @@
+from jinja2 import Environment, FileSystemLoader
+import os
+import json
+
+
+def gen_sys_obj_pages(matlab):
+
+ template_filename = "sysobj.html"
+
+ # Data for template
+ f = open("sysobjs.json")
+ objs = json.load(f)
+ f.close()
+
+ # Import template
+ loc = os.path.dirname(__file__)
+ loc = os.path.join(loc, "_templates")
+ file_loader = FileSystemLoader(loc)
+ env = Environment(loader=file_loader)
+
+ loc = os.path.join(template_filename)
+ template = env.get_template(loc)
+
+ devices = {}
+
+ def cleanup(obj):
+
+ # obj["dec"] = obj["dec"].replace("192.168.2.1", "ip:192.168.2.1")
+ d = obj["dec"]
+ ol = []
+ for d in obj["dec"].split(" "):
+
+ if "See also" in d:
+ continue
+ if "Documentation for" in d:
+ continue
+ if "doc adi." in d:
+ continue
+
+ ol.append(d)
+
+ obj["dec"] = " ".join(ol)
+ if ".Rx" in obj["name"]:
+ obj["type"] = "Rx"
+ else:
+ obj["type"] = "Tx"
+
+ return obj
+
+ for obj in objs:
+ # Render template
+ obj = cleanup(obj)
+ output = template.render(obj=obj, disable_nav=matlab)
+ # Write output
+ output_filename = f"sysobjects/{obj['name']}.md"
+ loc = os.path.join(output_filename)
+ f = open(loc, "w")
+ f.write(output)
+ f.close()
+ devices[obj["name"]] = output_filename
+
+ #if matlab:
+ if True:
+ # Generate index for objs
+ loc = os.path.join("allsysobjs.tmpl")
+ template = env.get_template(loc)
+ output = template.render(devices=devices, disable_nav=matlab)
+
+ loc = os.path.join("objects.md")
+ with open(loc, "w") as f:
+ f.write(output)
+
+ ###############################################################################
+ # HDL Refdesigns
+ ###############################################################################
+ from gen_hdl_refdesigns import update_hdl_refdesigns
+
+ designs = update_hdl_refdesigns()
+
+ # Update mkdocs.yml
+ loc = os.path.join("mkdocs.tmpl")
+ template = env.get_template(loc)
+ output = template.render(devices=devices, designs=designs, matlab=matlab)
+
+ loc = os.path.join("..", "mkdocs.yml")
+ with open(loc, "w") as f:
+ f.write(output)
+
+ return devices, designs
diff --git a/CI/gen_doc/docs/hdlrefdesigns/adrv9002.md b/CI/gen_doc/docs/hdlrefdesigns/adrv9002.md
new file mode 100644
index 0000000..1db2989
--- /dev/null
+++ b/CI/gen_doc/docs/hdlrefdesigns/adrv9002.md
@@ -0,0 +1,52 @@
+
+
+# adrv9002 Reference Design Integration
+
+This page outlines the HDL reference design integration for the *adrv9002* reference design for the Analog Devices
+ADRV9002 component. The IP-Core Generation follow is available on the based on the following base HDL reference design for the following board and design variants:
+
+- [Base reference design documentation](https://wiki.analog.com/resources/eval/user-guides/adrv9001/reference_hdl)
+- Supported FPGA carriers:
+ - ZCU102
+- Supported design variants:
+ - RX
+ - TX
+ - RX & TX
+
+## Reference Design
+
+
+
+ 
+
+ HDL Reference Design with Custom IP from HDL-Coder. Click on sub-blocks for more documentation.
+
+The IP-Core generation flow will integrate IP generated from Simulink subsystem into an ADI authored reference design. Depending on the FPGA carrier and FMC card or SoM, this will support different IP locations based on the diagram above.
+
+## HDL Worflow Advisor Port Mappings
+
+When using the HDL Worflow Advisor, the following port mappings are used to connect the reference design to the HDL-Coder generated IP-Core:
+
+| Type | Target Platform Interface (MATLAB) | Reference Design Connection (Vivado) | Width | Reference Design Variant |
+| ---- | ------------------------ | --------------------------- | ----- | ----------- |
+| VALID-OUT | IP Data Valid OUT | util_adc_1_pack/fifo_wr_en | 1 | RX |
+| VALID-IN | IP Valid Rx Data IN | axi_adrv9001/adc_1_valid_i0 | 1 | RX |
+| DATA-OUT | IP Data 0 OUT | util_adc_1_pack/fifo_wr_data_0 | 16 | RX |
+| DATA-OUT | IP Data 1 OUT | util_adc_1_pack/fifo_wr_data_1 | 16 | RX |
+| DATA-OUT | IP Data 2 OUT | util_adc_1_pack/fifo_wr_data_2 | 16 | RX |
+| DATA-OUT | IP Data 3 OUT | util_adc_1_pack/fifo_wr_data_3 | 16 | RX |
+| DATA-IN | ADRV9002 ADC Data Q0 | axi_adrv9001/adc_1_data_i0 | 16 | RX |
+| DATA-IN | ADRV9002 ADC Data I0 | axi_adrv9001/adc_1_data_i1 | 16 | RX |
+| DATA-IN | ADRV9002 ADC Data Q0 | axi_adrv9001/adc_1_data_q0 | 16 | RX |
+| DATA-IN | ADRV9002 ADC Data I0 | axi_adrv9001/adc_1_data_q1 | 16 | RX |
+| VALID-IN | IP Valid Tx Data IN | util_dac_1_upack/fifo_rd_valid | 1 | TX |
+| VALID-OUT | IP Load Tx Data OUT | util_dac_1_upack/fifo_rd_en | 1 | TX |
+| DATA-OUT | ADRV9002 DAC Data Q0 | axi_adrv9001/dac_1_data_i0 | 16 | TX |
+| DATA-OUT | ADRV9002 DAC Data I0 | axi_adrv9001/dac_1_data_i1 | 16 | TX |
+| DATA-OUT | ADRV9002 DAC Data Q0 | axi_adrv9001/dac_1_data_q0 | 16 | TX |
+| DATA-OUT | ADRV9002 DAC Data I0 | axi_adrv9001/dac_1_data_q1 | 16 | TX |
+| DATA-IN | IP Data 0 IN | util_dac_1_upack/fifo_rd_data_0 | 16 | TX |
+| DATA-IN | IP Data 1 IN | util_dac_1_upack/fifo_rd_data_1 | 16 | TX |
+| DATA-IN | IP Data 2 IN | util_dac_1_upack/fifo_rd_data_2 | 16 | TX |
+| DATA-IN | IP Data 3 IN | util_dac_1_upack/fifo_rd_data_3 | 16 | TX |
+
diff --git a/CI/gen_doc/docs/hdlrefdesigns/adrv9009.md b/CI/gen_doc/docs/hdlrefdesigns/adrv9009.md
new file mode 100644
index 0000000..a71e8f0
--- /dev/null
+++ b/CI/gen_doc/docs/hdlrefdesigns/adrv9009.md
@@ -0,0 +1,52 @@
+
+
+# adrv9009 Reference Design Integration
+
+This page outlines the HDL reference design integration for the *adrv9009* reference design for the Analog Devices
+ADRV9009 component. The IP-Core Generation follow is available on the based on the following base HDL reference design for the following board and design variants:
+
+- [Base reference design documentation](https://wiki.analog.com/resources/eval/user-guides/adrv9009/reference_hdl)
+- Supported FPGA carriers:
+ - ZCU102
+- Supported design variants:
+ - RX
+ - TX
+ - RX & TX
+
+## Reference Design
+
+
+
+ 
+
+ HDL Reference Design with Custom IP from HDL-Coder. Click on sub-blocks for more documentation.
+
+The IP-Core generation flow will integrate IP generated from Simulink subsystem into an ADI authored reference design. Depending on the FPGA carrier and FMC card or SoM, this will support different IP locations based on the diagram above.
+
+## HDL Worflow Advisor Port Mappings
+
+When using the HDL Worflow Advisor, the following port mappings are used to connect the reference design to the HDL-Coder generated IP-Core:
+
+| Type | Target Platform Interface (MATLAB) | Reference Design Connection (Vivado) | Width | Reference Design Variant |
+| ---- | ------------------------ | --------------------------- | ----- | ----------- |
+| VALID-OUT | IP Data Valid OUT | util_adrv9009_rx_cpack/fifo_wr_en | 1 | RX |
+| VALID-IN | IP Valid Rx Data IN | rx_adrv9009_tpl_core/adc_valid_0 | 1 | RX |
+| DATA-OUT | IP Data 0 OUT | util_adrv9009_rx_cpack/fifo_wr_data_0 | 16 | RX |
+| DATA-OUT | IP Data 1 OUT | util_adrv9009_rx_cpack/fifo_wr_data_1 | 16 | RX |
+| DATA-OUT | IP Data 2 OUT | util_adrv9009_rx_cpack/fifo_wr_data_2 | 16 | RX |
+| DATA-OUT | IP Data 3 OUT | util_adrv9009_rx_cpack/fifo_wr_data_3 | 16 | RX |
+| DATA-IN | ADRV9009 ADC Data Q0 | rx_adrv9009_tpl_core/adc_data_0 | 16 | RX |
+| DATA-IN | ADRV9009 ADC Data I0 | rx_adrv9009_tpl_core/adc_data_1 | 16 | RX |
+| DATA-IN | ADRV9009 ADC Data Q1 | rx_adrv9009_tpl_core/adc_data_2 | 16 | RX |
+| DATA-IN | ADRV9009 ADC Data I1 | rx_adrv9009_tpl_core/adc_data_3 | 16 | RX |
+| VALID-IN | IP Valid Tx Data IN | util_adrv9009_tx_upack/fifo_rd_valid | 1 | TX |
+| VALID-OUT | IP Load Tx Data OUT | util_adrv9009_tx_upack/fifo_rd_en | 1 | TX |
+| DATA-OUT | ADRV9009 DAC Data Q0 | tx_adrv9009_tpl_core/dac_data_0 | 16 | TX |
+| DATA-OUT | ADRV9009 DAC Data I0 | tx_adrv9009_tpl_core/dac_data_1 | 16 | TX |
+| DATA-OUT | ADRV9009 DAC Data Q1 | tx_adrv9009_tpl_core/dac_data_2 | 16 | TX |
+| DATA-OUT | ADRV9009 DAC Data I1 | tx_adrv9009_tpl_core/dac_data_3 | 16 | TX |
+| DATA-IN | IP Data 0 IN | util_adrv9009_tx_upack/fifo_rd_data_0 | 16 | TX |
+| DATA-IN | IP Data 1 IN | util_adrv9009_tx_upack/fifo_rd_data_1 | 16 | TX |
+| DATA-IN | IP Data 2 IN | util_adrv9009_tx_upack/fifo_rd_data_2 | 16 | TX |
+| DATA-IN | IP Data 3 IN | util_adrv9009_tx_upack/fifo_rd_data_3 | 16 | TX |
+
diff --git a/CI/gen_doc/docs/hdlrefdesigns/adrv9361z7035.md b/CI/gen_doc/docs/hdlrefdesigns/adrv9361z7035.md
new file mode 100644
index 0000000..45d0773
--- /dev/null
+++ b/CI/gen_doc/docs/hdlrefdesigns/adrv9361z7035.md
@@ -0,0 +1,56 @@
+
+
+# adrv9361z7035 Reference Design Integration
+
+This page outlines the HDL reference design integration for the *adrv9361z7035* reference design for the Analog Devices
+AD9361 component. The IP-Core Generation follow is available on the based on the following base HDL reference design for the following board and design variants:
+
+- [Base reference design documentation](https://wiki.analog.com/resources/eval/user-guides/ad-fmcomms2-ebz/reference_hdl)
+- Supported FPGA carriers:
+ - CCBOB_CMOS
+ - CCBOB_LVDS
+ - CCBOX_LVDS
+ - CCFMC_LVDS
+ - CCPACKRF_LVDS
+- Supported design variants:
+ - RX
+ - TX
+ - RX & TX
+
+## Reference Design
+
+
+
+ 
+
+ HDL Reference Design with Custom IP from HDL-Coder. Click on sub-blocks for more documentation.
+
+The IP-Core generation flow will integrate IP generated from Simulink subsystem into an ADI authored reference design. Depending on the FPGA carrier and FMC card or SoM, this will support different IP locations based on the diagram above.
+
+## HDL Worflow Advisor Port Mappings
+
+When using the HDL Worflow Advisor, the following port mappings are used to connect the reference design to the HDL-Coder generated IP-Core:
+
+| Type | Target Platform Interface (MATLAB) | Reference Design Connection (Vivado) | Width | Reference Design Variant |
+| ---- | ------------------------ | --------------------------- | ----- | ----------- |
+| VALID-OUT | IP Data Valid OUT | util_ad9361_adc_pack/fifo_wr_en | 1 | RX |
+| VALID-IN | IP Valid Rx Data IN | util_ad9361_adc_fifo/dout_valid_0 | 1 | RX |
+| DATA-OUT | IP Data 0 OUT | util_ad9361_adc_pack/fifo_wr_data_0 | 16 | RX |
+| DATA-OUT | IP Data 1 OUT | util_ad9361_adc_pack/fifo_wr_data_1 | 16 | RX |
+| DATA-OUT | IP Data 2 OUT | util_ad9361_adc_pack/fifo_wr_data_2 | 16 | RX |
+| DATA-OUT | IP Data 3 OUT | util_ad9361_adc_pack/fifo_wr_data_3 | 16 | RX |
+| DATA-IN | AD9361 ADC Data Q0 | util_ad9361_adc_fifo/dout_data_0 | 16 | RX |
+| DATA-IN | AD9361 ADC Data I0 | util_ad9361_adc_fifo/dout_data_1 | 16 | RX |
+| DATA-IN | AD9361 ADC Data Q1 | util_ad9361_adc_fifo/dout_data_2 | 16 | RX |
+| DATA-IN | AD9361 ADC Data I1 | util_ad9361_adc_fifo/dout_data_3 | 16 | RX |
+| VALID-IN | IP Valid Tx Data IN | util_ad9361_dac_upack/fifo_rd_valid | 1 | TX |
+| VALID-OUT | IP Load Tx Data OUT | axi_ad9361_dac_fifo/din_valid_in_0 | 1 | TX |
+| DATA-OUT | AD9361 DAC Data Q0 | axi_ad9361_dac_fifo/din_data_0 | 16 | TX |
+| DATA-OUT | AD9361 DAC Data I0 | axi_ad9361_dac_fifo/din_data_1 | 16 | TX |
+| DATA-OUT | AD9361 DAC Data Q1 | axi_ad9361_dac_fifo/din_data_2 | 16 | TX |
+| DATA-OUT | AD9361 DAC Data I1 | axi_ad9361_dac_fifo/din_data_3 | 16 | TX |
+| DATA-IN | IP Data 0 IN | util_ad9361_dac_upack/fifo_rd_data_0 | 16 | TX |
+| DATA-IN | IP Data 1 IN | util_ad9361_dac_upack/fifo_rd_data_1 | 16 | TX |
+| DATA-IN | IP Data 2 IN | util_ad9361_dac_upack/fifo_rd_data_2 | 16 | TX |
+| DATA-IN | IP Data 3 IN | util_ad9361_dac_upack/fifo_rd_data_3 | 16 | TX |
+
diff --git a/CI/gen_doc/docs/hdlrefdesigns/adrv9364z7020.md b/CI/gen_doc/docs/hdlrefdesigns/adrv9364z7020.md
new file mode 100644
index 0000000..7faf6b7
--- /dev/null
+++ b/CI/gen_doc/docs/hdlrefdesigns/adrv9364z7020.md
@@ -0,0 +1,54 @@
+
+
+# adrv9364z7020 Reference Design Integration
+
+This page outlines the HDL reference design integration for the *adrv9364z7020* reference design for the Analog Devices
+AD9364 component. The IP-Core Generation follow is available on the based on the following base HDL reference design for the following board and design variants:
+
+- [Base reference design documentation](https://wiki.analog.com/resources/eval/user-guides/ad-fmcomms2-ebz/reference_hdl)
+- Supported FPGA carriers:
+ - CCBOB_CMOS
+ - CCBOB_LVDS
+ - CCBOX_LVDS
+- Supported design variants:
+ - RX
+ - TX
+ - RX & TX
+
+## Reference Design
+
+
+
+ 
+
+ HDL Reference Design with Custom IP from HDL-Coder. Click on sub-blocks for more documentation.
+
+The IP-Core generation flow will integrate IP generated from Simulink subsystem into an ADI authored reference design. Depending on the FPGA carrier and FMC card or SoM, this will support different IP locations based on the diagram above.
+
+## HDL Worflow Advisor Port Mappings
+
+When using the HDL Worflow Advisor, the following port mappings are used to connect the reference design to the HDL-Coder generated IP-Core:
+
+| Type | Target Platform Interface (MATLAB) | Reference Design Connection (Vivado) | Width | Reference Design Variant |
+| ---- | ------------------------ | --------------------------- | ----- | ----------- |
+| VALID-OUT | IP Data Valid OUT | util_ad9361_adc_pack/fifo_wr_en | 1 | RX |
+| VALID-IN | IP Valid Rx Data IN | util_ad9361_adc_fifo/dout_valid_0 | 1 | RX |
+| DATA-OUT | IP Data 0 OUT | util_ad9361_adc_pack/fifo_wr_data_0 | 16 | RX |
+| DATA-OUT | IP Data 1 OUT | util_ad9361_adc_pack/fifo_wr_data_1 | 16 | RX |
+| DATA-OUT | IP Data 2 OUT | util_ad9361_adc_pack/fifo_wr_data_2 | 16 | RX |
+| DATA-OUT | IP Data 3 OUT | util_ad9361_adc_pack/fifo_wr_data_3 | 16 | RX |
+| DATA-IN | AD9364 ADC Data Q0 | util_ad9361_adc_fifo/dout_data_0 | 16 | RX |
+| DATA-IN | AD9364 ADC Data I0 | util_ad9361_adc_fifo/dout_data_1 | 16 | RX |
+| DATA-IN | AD9364 ADC Data Q1 | util_ad9361_adc_fifo/dout_data_2 | 16 | RX |
+| DATA-IN | AD9364 ADC Data I1 | util_ad9361_adc_fifo/dout_data_3 | 16 | RX |
+| VALID-IN | IP Valid Tx Data IN | util_ad9361_dac_upack/fifo_rd_valid | 1 | TX |
+| VALID-OUT | IP Load Tx Data OUT | axi_ad9361_dac_fifo/din_valid_in_0 | 1 | TX |
+| DATA-OUT | AD9364 DAC Data Q0 | axi_ad9361_dac_fifo/din_data_0 | 16 | TX |
+| DATA-OUT | AD9364 DAC Data I0 | axi_ad9361_dac_fifo/din_data_1 | 16 | TX |
+| DATA-OUT | AD9364 DAC Data Q1 | axi_ad9361_dac_fifo/din_data_2 | 16 | TX |
+| DATA-OUT | AD9364 DAC Data I1 | axi_ad9361_dac_fifo/din_data_3 | 16 | TX |
+| DATA-IN | IP Data 0 IN | util_ad9361_dac_upack/fifo_rd_data_0 | 16 | TX |
+| DATA-IN | IP Data 1 IN | util_ad9361_dac_upack/fifo_rd_data_1 | 16 | TX |
+| DATA-IN | IP Data 2 IN | util_ad9361_dac_upack/fifo_rd_data_2 | 16 | TX |
+| DATA-IN | IP Data 3 IN | util_ad9361_dac_upack/fifo_rd_data_3 | 16 | TX |
+
diff --git a/CI/gen_doc/docs/hdlrefdesigns/adrv9371.md b/CI/gen_doc/docs/hdlrefdesigns/adrv9371.md
new file mode 100644
index 0000000..dd6fe5e
--- /dev/null
+++ b/CI/gen_doc/docs/hdlrefdesigns/adrv9371.md
@@ -0,0 +1,52 @@
+
+
+# adrv9371 Reference Design Integration
+
+This page outlines the HDL reference design integration for the *adrv9371* reference design for the Analog Devices
+AD9371 component. The IP-Core Generation follow is available on the based on the following base HDL reference design for the following board and design variants:
+
+- [Base reference design documentation](https://wiki.analog.com/resources/eval/user-guides/mykonos/reference_hdl)
+- Supported FPGA carriers:
+ - ZC706
+ - ZCU102
+- Supported design variants:
+ - RX
+ - TX
+
+## Reference Design
+
+
+
+ 
+
+ HDL Reference Design with Custom IP from HDL-Coder. Click on sub-blocks for more documentation.
+
+The IP-Core generation flow will integrate IP generated from Simulink subsystem into an ADI authored reference design. Depending on the FPGA carrier and FMC card or SoM, this will support different IP locations based on the diagram above.
+
+## HDL Worflow Advisor Port Mappings
+
+When using the HDL Worflow Advisor, the following port mappings are used to connect the reference design to the HDL-Coder generated IP-Core:
+
+| Type | Target Platform Interface (MATLAB) | Reference Design Connection (Vivado) | Width | Reference Design Variant |
+| ---- | ------------------------ | --------------------------- | ----- | ----------- |
+| VALID-OUT | IP Data Valid OUT | util_ad9371_rx_cpack/fifo_wr_en | 1 | RX |
+| VALID-IN | IP Valid Rx Data IN | rx_ad9371_tpl_core/adc_valid_0 | 1 | RX |
+| DATA-OUT | IP Data 0 OUT | util_ad9361_adc_pack/fifo_wr_data_0 | 16 | RX |
+| DATA-OUT | IP Data 1 OUT | util_ad9361_adc_pack/fifo_wr_data_1 | 16 | RX |
+| DATA-OUT | IP Data 2 OUT | util_ad9361_adc_pack/fifo_wr_data_2 | 16 | RX |
+| DATA-OUT | IP Data 3 OUT | util_ad9361_adc_pack/fifo_wr_data_3 | 16 | RX |
+| DATA-IN | AD9371 ADC Data Q0 | rx_ad9371_tpl_core/adc_data_0 | 16 | RX |
+| DATA-IN | AD9371 ADC Data I0 | rx_ad9371_tpl_core/adc_data_1 | 16 | RX |
+| DATA-IN | AD9371 ADC Data Q1 | rx_ad9371_tpl_core/adc_data_2 | 16 | RX |
+| DATA-IN | AD9371 ADC Data I1 | rx_ad9371_tpl_core/adc_data_3 | 16 | RX |
+| VALID-IN | IP Valid Tx Data IN | util_ad9371_tx_upack/fifo_rd_valid | 1 | TX |
+| VALID-OUT | IP Load Tx Data OUT | util_ad9371_tx_upack/fifo_rd_en | 1 | TX |
+| DATA-OUT | AD9371 DAC Data Q0 | tx_ad9371_tpl_core/dac_data_0 | 32 | TX |
+| DATA-OUT | AD9371 DAC Data I0 | tx_ad9371_tpl_core/dac_data_1 | 32 | TX |
+| DATA-OUT | AD9371 DAC Data Q1 | tx_ad9371_tpl_core/dac_data_2 | 32 | TX |
+| DATA-OUT | AD9371 DAC Data I1 | tx_ad9371_tpl_core/dac_data_3 | 32 | TX |
+| DATA-IN | IP Data 0 IN | util_ad9371_tx_upack/fifo_rd_data_0 | 32 | TX |
+| DATA-IN | IP Data 1 IN | util_ad9371_tx_upack/fifo_rd_data_1 | 32 | TX |
+| DATA-IN | IP Data 2 IN | util_ad9371_tx_upack/fifo_rd_data_2 | 32 | TX |
+| DATA-IN | IP Data 3 IN | util_ad9371_tx_upack/fifo_rd_data_3 | 32 | TX |
+
diff --git a/CI/gen_doc/docs/hdlrefdesigns/daq2.md b/CI/gen_doc/docs/hdlrefdesigns/daq2.md
new file mode 100644
index 0000000..eeb0075
--- /dev/null
+++ b/CI/gen_doc/docs/hdlrefdesigns/daq2.md
@@ -0,0 +1,54 @@
+
+
+
+# daq2 Reference Design Integration
+
+This page outlines the HDL reference design integration for the *daq2* reference design for the Analog Devices
+AD9680 and AD9144 component. The IP-Core Generation follow is available on the based on the following base HDL reference design for the following board and design variants:
+
+- [Base reference design documentation](https://wiki.analog.com/resources/eval/user-guides/daq2/reference_hdl)
+- Supported FPGA carriers:
+ - ZC706
+ - ZCU102
+- Supported design variants:
+ - RX
+ - TX
+ - RX & TX
+
+## Reference Design
+
+
+
+ 
+
+ HDL Reference Design with Custom IP from HDL-Coder. Click on sub-blocks for more documentation.
+
+The IP-Core generation flow will integrate IP generated from Simulink subsystem into an ADI authored reference design. Depending on the FPGA carrier and FMC card or SoM, this will support different IP locations based on the diagram above.
+
+## HDL Worflow Advisor Port Mappings
+
+When using the HDL Worflow Advisor, the following port mappings are used to connect the reference design to the HDL-Coder generated IP-Core:
+
+| Type | Target Platform Interface (MATLAB) | Reference Design Connection (Vivado) | Width | Reference Design Variant |
+| ---- | ------------------------ | --------------------------- | ----- | ----------- |
+| VALID-OUT | IP Data Valid OUT | util_ad9680_cpack/fifo_wr_en | 1 | RX |
+| VALID-IN | IP Valid Rx Data IN | rx_ad9680_tpl_core/adc_valid_0 | 1 | RX |
+| DATA-OUT | IP Data 0 OUT | util_ad9680_cpack/fifo_wr_data_0 | 16 | RX |
+| DATA-OUT | IP Data 1 OUT | util_ad9680_cpack/fifo_wr_data_1 | 16 | RX |
+| DATA-OUT | IP Data 2 OUT | util_ad9680_cpack/fifo_wr_data_2 | 16 | RX |
+| DATA-OUT | IP Data 3 OUT | util_ad9680_cpack/fifo_wr_data_3 | 16 | RX |
+| DATA-IN | AD9680 and AD9144 ADC Data Q0 | rx_ad9680_tpl_core/adc_data_0 | 16 | RX |
+| DATA-IN | AD9680 and AD9144 ADC Data I0 | rx_ad9680_tpl_core/adc_data_1 | 16 | RX |
+| DATA-IN | AD9680 and AD9144 ADC Data Q1 | rx_ad9680_tpl_core/adc_data_2 | 16 | RX |
+| DATA-IN | AD9680 and AD9144 ADC Data I1 | rx_ad9680_tpl_core/adc_data_3 | 16 | RX |
+| VALID-IN | IP Valid Tx Data IN | util_ad9144_upack/fifo_rd_valid | 1 | TX |
+| VALID-OUT | IP Load Tx Data OUT | util_ad9144_upack/fifo_rd_en | 1 | TX |
+| DATA-OUT | AD9680 and AD9144 DAC Data Q0 | ad9144_tpl_core/dac_data_0 | 16 | TX |
+| DATA-OUT | AD9680 and AD9144 DAC Data I0 | ad9144_tpl_core/dac_data_1 | 16 | TX |
+| DATA-OUT | AD9680 and AD9144 DAC Data Q1 | ad9144_tpl_core/dac_data_2 | 16 | TX |
+| DATA-OUT | AD9680 and AD9144 DAC Data I1 | ad9144_tpl_core/dac_data_3 | 16 | TX |
+| DATA-IN | IP Data 0 IN | util_ad9144_upack/fifo_rd_data_0 | 16 | TX |
+| DATA-IN | IP Data 1 IN | util_ad9144_upack/fifo_rd_data_1 | 16 | TX |
+| DATA-IN | IP Data 2 IN | util_ad9144_upack/fifo_rd_data_2 | 16 | TX |
+| DATA-IN | IP Data 3 IN | util_ad9144_upack/fifo_rd_data_3 | 16 | TX |
+
diff --git a/CI/gen_doc/docs/hdlrefdesigns/fmcomms2.md b/CI/gen_doc/docs/hdlrefdesigns/fmcomms2.md
new file mode 100644
index 0000000..fc2772f
--- /dev/null
+++ b/CI/gen_doc/docs/hdlrefdesigns/fmcomms2.md
@@ -0,0 +1,54 @@
+
+
+# fmcomms2 Reference Design Integration
+
+This page outlines the HDL reference design integration for the *fmcomms2* reference design for the Analog Devices
+AD9361 component. The IP-Core Generation follow is available on the based on the following base HDL reference design for the following board and design variants:
+
+- [Base reference design documentation](https://wiki.analog.com/resources/eval/user-guides/ad-fmcomms2-ebz/reference_hdl)
+- Supported FPGA carriers:
+ - ZED
+ - ZC706
+ - ZC702
+- Supported design variants:
+ - RX
+ - TX
+ - RX & TX
+
+## Reference Design
+
+
+
+ 
+
+ HDL Reference Design with Custom IP from HDL-Coder. Click on sub-blocks for more documentation.
+
+The IP-Core generation flow will integrate IP generated from Simulink subsystem into an ADI authored reference design. Depending on the FPGA carrier and FMC card or SoM, this will support different IP locations based on the diagram above.
+
+## HDL Worflow Advisor Port Mappings
+
+When using the HDL Worflow Advisor, the following port mappings are used to connect the reference design to the HDL-Coder generated IP-Core:
+
+| Type | Target Platform Interface (MATLAB) | Reference Design Connection (Vivado) | Width | Reference Design Variant |
+| ---- | ------------------------ | --------------------------- | ----- | ----------- |
+| VALID-OUT | IP Data Valid OUT | util_ad9361_adc_pack/fifo_wr_en | 1 | RX |
+| VALID-IN | IP Valid Rx Data IN | util_ad9361_adc_fifo/dout_valid_0 | 1 | RX |
+| DATA-OUT | IP Data 0 OUT | util_ad9361_adc_pack/fifo_wr_data_0 | 16 | RX |
+| DATA-OUT | IP Data 1 OUT | util_ad9361_adc_pack/fifo_wr_data_1 | 16 | RX |
+| DATA-OUT | IP Data 2 OUT | util_ad9361_adc_pack/fifo_wr_data_2 | 16 | RX |
+| DATA-OUT | IP Data 3 OUT | util_ad9361_adc_pack/fifo_wr_data_3 | 16 | RX |
+| DATA-IN | AD9361 ADC Data Q0 | util_ad9361_adc_fifo/dout_data_0 | 16 | RX |
+| DATA-IN | AD9361 ADC Data I0 | util_ad9361_adc_fifo/dout_data_1 | 16 | RX |
+| DATA-IN | AD9361 ADC Data Q1 | util_ad9361_adc_fifo/dout_data_2 | 16 | RX |
+| DATA-IN | AD9361 ADC Data I1 | util_ad9361_adc_fifo/dout_data_3 | 16 | RX |
+| VALID-IN | IP Valid Tx Data IN | util_ad9361_dac_upack/fifo_rd_valid | 1 | TX |
+| VALID-OUT | IP Load Tx Data OUT | axi_ad9361_dac_fifo/din_valid_in_0 | 1 | TX |
+| DATA-OUT | AD9361 DAC Data Q0 | axi_ad9361_dac_fifo/din_data_0 | 16 | TX |
+| DATA-OUT | AD9361 DAC Data I0 | axi_ad9361_dac_fifo/din_data_1 | 16 | TX |
+| DATA-OUT | AD9361 DAC Data Q1 | axi_ad9361_dac_fifo/din_data_2 | 16 | TX |
+| DATA-OUT | AD9361 DAC Data I1 | axi_ad9361_dac_fifo/din_data_3 | 16 | TX |
+| DATA-IN | IP Data 0 IN | util_ad9361_dac_upack/fifo_rd_data_0 | 16 | TX |
+| DATA-IN | IP Data 1 IN | util_ad9361_dac_upack/fifo_rd_data_1 | 16 | TX |
+| DATA-IN | IP Data 2 IN | util_ad9361_dac_upack/fifo_rd_data_2 | 16 | TX |
+| DATA-IN | IP Data 3 IN | util_ad9361_dac_upack/fifo_rd_data_3 | 16 | TX |
+
diff --git a/CI/gen_doc/docs/hdlrefdesigns/pluto.md b/CI/gen_doc/docs/hdlrefdesigns/pluto.md
new file mode 100644
index 0000000..f1b308a
--- /dev/null
+++ b/CI/gen_doc/docs/hdlrefdesigns/pluto.md
@@ -0,0 +1,42 @@
+
+
+# pluto Reference Design Integration
+
+This page outlines the HDL reference design integration for the *pluto* reference design for the Analog Devices
+AD9361 component. The IP-Core Generation follow is available on the based on the following base HDL reference design for the following board and design variants:
+
+- [Base reference design documentation](https://wiki.analog.com/resources/eval/user-guides/ad-fmcomms2-ebz/reference_hdl)
+- Supported FPGA carriers:
+- Supported design variants:
+ - RX
+ - TX
+
+## Reference Design
+
+
+
+ 
+
+ HDL Reference Design with Custom IP from HDL-Coder. Click on sub-blocks for more documentation.
+
+The IP-Core generation flow will integrate IP generated from Simulink subsystem into an ADI authored reference design. Depending on the FPGA carrier and FMC card or SoM, this will support different IP locations based on the diagram above.
+
+## HDL Worflow Advisor Port Mappings
+
+When using the HDL Worflow Advisor, the following port mappings are used to connect the reference design to the HDL-Coder generated IP-Core:
+
+| Type | Target Platform Interface (MATLAB) | Reference Design Connection (Vivado) | Width | Reference Design Variant |
+| ---- | ------------------------ | --------------------------- | ----- | ----------- |
+| VALID-OUT | IP Data Valid OUT | cpack/fifo_wr_en | 1 | RX |
+| VALID-IN | IP Valid Rx Data IN | axi_ad9361/adc_valid_i0 | 1 | RX |
+| DATA-OUT | IP Data 0 OUT | cpack/fifo_wr_data_0 | 16 | RX |
+| DATA-OUT | IP Data 1 OUT | cpack/fifo_wr_data_1 | 16 | RX |
+| DATA-IN | AD9361 ADC Data Q0 | axi_ad9361/adc_data_i0 | 16 | RX |
+| DATA-IN | AD9361 ADC Data Q0 | axi_ad9361/adc_data_q0 | 16 | RX |
+| VALID-IN | IP Valid Tx Data IN | tx_upack/fifo_rd_valid | 1 | TX |
+| VALID-OUT | IP Load Tx Data OUT | logic_or/Op1 | 1 | TX |
+| DATA-OUT | AD9361 DAC Data Q0 | axi_ad9361/dac_data_i0 | 16 | TX |
+| DATA-OUT | AD9361 DAC Data Q0 | axi_ad9361/dac_data_q0 | 16 | TX |
+| DATA-IN | IP Data 0 IN | util_ad9361_dac_upack/fifo_rd_data_0 | 16 | TX |
+| DATA-IN | IP Data 1 IN | util_ad9361_dac_upack/fifo_rd_data_1 | 16 | TX |
+
diff --git a/CI/gen_doc/docs/helptoc.xml b/CI/gen_doc/docs/helptoc.xml
new file mode 100644
index 0000000..aa53e2d
--- /dev/null
+++ b/CI/gen_doc/docs/helptoc.xml
@@ -0,0 +1,28 @@
+
+
+ Analog Devices, Inc High-Speed Converter Toolbox
+ Install
+ Support
+ Examples
+ Models
+ Streaming
+ Index
+ Targeting
+ Behavioral Models
+ AD9081: MxFE
+ ADC
+ DAC
+ DDC
+ DUC
+ PFILT
+
+
+ Hardware Interface APIs
+ adi.AD9081.Rx
+ adi.AD9081.Tx
+ adi.AD9467.Rx
+ adi.DAQ2.Rx
+ adi.DAQ2.Tx
+
+
+
\ No newline at end of file
diff --git a/CI/gen_doc/docs/js/sys_objects.js b/CI/gen_doc/docs/js/sys_objects.js
new file mode 100644
index 0000000..44bcd99
--- /dev/null
+++ b/CI/gen_doc/docs/js/sys_objects.js
@@ -0,0 +1,43 @@
+function collapse(id) {
+ console.log(id);
+ var el = document.getElementsByClassName('collapsible-property-' + id);
+ el[0].classList.toggle("active");
+ var elb = el[0];
+
+ el = document.getElementsByClassName('content-'+id);
+ // console.log(el);
+ if (el.length > 0) {
+ el0 = el[0];
+ console.log(el0.style);
+ console.log("Updating style")
+ // console.log(el0.style.display)
+ el0.style.display = (el0.style.display == 'none' ? 'block' : 'none');
+
+ console.log(elb.style.borderBottomLeftRadius)
+ elb.style.borderBottomLeftRadius = (el0.style.display == 'none' ? '5px' : '0px');
+ // elb.style.borderBottomLeftRadius = (el0.style.display == 'none' ? '0px' : '25px');
+ console.log(elb.style.borderBottomLeftRadius)
+
+ el = document.getElementsByClassName('plus-'+id);
+ el[0].innerHTML = (el0.style.display == 'none' ? '+' : '-');
+
+ }
+}
+
+
+// var coll = document.getElementsByClassName("collapsible-property");
+// var i;
+
+// for (i = 0; i < coll.length; i++) {
+// coll[i].addEventListener("click", function() {
+// console.log("CALLED");
+// this.classList.toggle("active");
+// var content = this.nextElementSibling;
+// console.log(content);
+// if (content.style.display === "block") {
+// content.style.display = "none";
+// } else {
+// content.style.display = "block";
+// }
+// });
+// }
\ No newline at end of file
diff --git a/CI/gen_doc/docs/models/ad9081/adc.tex.md b/CI/gen_doc/docs/models/ad9081/adc.tex.md
new file mode 100644
index 0000000..c67a734
--- /dev/null
+++ b/CI/gen_doc/docs/models/ad9081/adc.tex.md
@@ -0,0 +1,80 @@
+# AD9081 ADC and ADC Mux
+
+
+The pipelined ADC models are simplified behavioral implementations that are based on the currently estimated specifications of the data converters. They are designed to be similar to the noise spectral density (NSD) of the converters. Note that since physical hardware does not exist these are estimated values and will likely change. There will be other distortions introduce by physical hardware as well, relating to front-end matches, internal chip structures, baluns, and gains stages among others. The ADC model should be considered similar but not exact.
+
+
+# Top-Level Control
+
+
+There are two control properties related to ADC control: **SampleRate** and **Crossbar4x4Mux0**.
+
+
+
+
+**SampleRate** is the data rate of the converters themselves. Therefore, the output datarate of the model will be this SampleRate divided by the different decimations used.
+
+
+
+```python
+help adi.sim.AD9081.Rx.SampleRate
+```
+
+
+```
+ SampleRate Sample Rate of ADCs
+ Scalar in Hz. Currently this is fixed since NSD will change
+ with this number, which would make the model invalid
+```
+
+
+
+**Crossbar4x4Mux0** is a full crossbar mux connecting the ADCs to the rest of the system.
+
+
+
+```python
+help adi.sim.AD9081.Rx.Crossbar4x4Mux0
+```
+
+
+```
+ Crossbar4x4Mux0 Crossbar 4x4 Mux0
+ Array of input and output mapping. Index is the output and the
+ value is the selected input
+```
+
+# Example Configuration
+
+
+Here is a basic example were we want to map ADC0, ADC1, and ADC2 out only.
+
+
+
+```python
+rx = adi.sim.AD9081.Rx;
+rx.SampleRate = 4e9;
+rx.Crossbar4x4Mux0 = [1,1,3,4];
+% Pass noise through model at 10% and 1% fullscale
+noiseVolts1 = 1.4/2*0.1*randn(1000,1);
+noiseVolts2 = 1.4/2*0.01*randn(1000,1);
+[o1,o2,~,~,o3,o4] = rx(noiseVolts1,noiseVolts2,noiseVolts1,noiseVolts1);
+outs = [o1,o2,o3,o4];
+fprintf('Mapped values identical %d\n',isequal(outs(:,1),outs(:,2)))
+```
+
+
+```
+Mapped values identical 1
+```
+
+
+```python
+fprintf('Mapped values identical %d\n',isequal(outs(:,3),outs(:,4)))
+```
+
+
+```
+Mapped values identical 0
+```
+
diff --git a/CI/gen_doc/docs/models/ad9081/dac.tex.md b/CI/gen_doc/docs/models/ad9081/dac.tex.md
new file mode 100644
index 0000000..479c13d
--- /dev/null
+++ b/CI/gen_doc/docs/models/ad9081/dac.tex.md
@@ -0,0 +1,32 @@
+# AD9081 DAC
+
+
+The DAC models are simplified behavioral implementations that are based on the currently estimated specifications of the data converters. They are designed to match the noise spectral density (NSD). Note that since physical hardware does not exist these are estimated values and will likely change by a few dB.
+
+
+# Top-Level Control
+
+
+There are one control properties related to the DACs: **SampleRate**.
+
+
+
+
+**SampleRate** is the data rate of the converters themselves. Therefore, the input datarate of the model will be this **SampleRate** divided by the different interpolations used.
+
+
+
+```python
+help adi.sim.AD9081.Tx.SampleRate
+```
+
+
+```
+ SampleRate Sample Rate of DACs
+ Scalar in Hz
+ InverseSincGainAdjustDB Inverse Gain Adjust DB
+ Add gain to the output signal filter. Gain is in dB and can
+ only be >=0 but <=8.7040. This will be internally quantized
+ based on the 8-bit allowed values with steps of 0.034dB.
+```
+
diff --git a/CI/gen_doc/docs/models/ad9081/ddc2.tex.md b/CI/gen_doc/docs/models/ad9081/ddc2.tex.md
new file mode 100644
index 0000000..7bfc204
--- /dev/null
+++ b/CI/gen_doc/docs/models/ad9081/ddc2.tex.md
@@ -0,0 +1,158 @@
+# AD9081 Digital Down Converters
+
+
+The AD9081 has two sets of digital down converters (DDC), the coarse (CDDC) and fine (FDDC), both following the ADC and PFILTs. These are used to both decimate and move signals using the NCOs. They also can be used to phase shift and apply gain to the input signal.
+
+
+
+
+The CDDCs and FDDC are almost identical except for their available decimations, allowable rates, and count. There are two CDDCs per ADC pair and four FDDCs per ADC pair. In the data pipeline, data from the ADCs will be passed through the CDDCs, or bypass the CDDCs, then routed through a mux into the FDDCs, which can also be bypassed.
+
+
+# Top-Level Control
+
+
+The CDDC and FDDC decimations are controlled by **MainDataPathDecimation** and **ChannelizerPathDecimation** respectively.
+
+
+
+```python
+help adi.sim.AD9081.Rx.MainDataPathDecimation
+```
+
+
+```
+ MainDataPathDecimation Main Data Path Decimation
+ Specify the decimation in the main data path which can be
+ [1,2,3,4,6]
+```
+
+
+```python
+help adi.sim.AD9081.Rx.ChannelizerPathDecimation
+```
+
+
+```
+ ChannelizerPathDecimation Channelizer Path Decimation
+ Specify the decimation in the channelizer path which can be
+ [1,2,3,4,6,8,12,16,24]
+```
+
+## Muxing
+
+
+The CDDC pairs share a common full crossbar to the four downstream FDDCs connected to them. This is represented by a single crossbar that limits routes to the halves of AD9081. This crossbar or mux is controlled by the **Crossbar4x8Mux2** and will constrain all the mappings.
+
+
+
+```python
+help adi.sim.AD9081.Rx.Crossbar4x8Mux2
+```
+
+
+```
+ Crossbar4x8Mux2 Crossbar 4x8 Mux2
+ Array of input and output mapping. Index is the output and the
+ value is the selected input (values should not exceed 4)
+```
+
+## NCO Mixer Enable and Modes
+
+
+If the NCOs need to be used they must be individually enabled through the **CDDCNCOEnable** and **FDDCNCOEnable** properties, which are both arrays of booleans.
+
+
+
+```python
+help adi.sim.AD9081.Rx.CDDCNCOEnable
+```
+
+
+```
+ CDDCNCOEnable CDDC NCO Enable
+ 1x4 Array of booleans to enable NCOs in main data path
+```
+
+
+```python
+help adi.sim.AD9081.Rx.FDDCNCOEnable
+```
+
+
+```
+ FDDCNCOEnable FDDC NCO Enable
+ 1x4 Array of booleans to enable NCOs in channelizer path
+```
+
+## NCO Frequency and Phase
+
+
+Once the NCOs are enabled the frequencies and phases of the NCOs can be controlled individually. This is done through the **CDDCNCOFrequencies, FDDCNCOFrequencies**, **CDDCNCOPhases**, and **FDDCNCOPhases**. The frequencies will be limited based on the rate going into the NCO at that stage. Note that both the frequency and phase values are internally quantized to 48-bits based on the effective range of the NCO based on the sample rate into a given stage.
+
+
+
+```python
+help adi.sim.AD9081.Rx.CDDCNCOFrequencies
+```
+
+
+```
+ CDDCNCOFrequencies CDDC NCO Frequencies
+ 1x4 Array of frequencies of NCOs in main data path
+```
+
+
+```python
+help adi.sim.AD9081.Rx.FDDCNCOFrequencies
+```
+
+
+```
+ FDDCNCOFrequencies FDDC NCO Frequencies
+ 1x8 Array of frequencies of NCOs in channelizer path
+```
+
+# Example Configuration
+
+
+The example below take a single input tone and shifts it into separate channels using the CDDC NCOs.
+
+
+
+```python
+rx = adi.sim.AD9081.Rx;
+% Enable 3 NCOs to shift single into different bands
+rx.MainDataPathDecimation = 4;
+rx.CDDCNCOEnable = [true,true,true,false];
+rx.CDDCNCOFrequencies = [5e7,-3e7,1e8,0];
+rx.Crossbar4x8Mux2 = [1,2,1,2,3,4,3,4];
+% Create sinewave input
+sw = dsp.SineWave;
+sw.Amplitude = 1.4*0.5;
+sw.Frequency = 100e6;
+sw.SampleRate = rx.SampleRate;
+sw.SamplesPerFrame = 4e4;
+data = sw();
+[o1,o2,~,~,o5,o6] = rx(data,data,data,data);
+outputCodes = [o1,o2,o5,o6];
+% Plot spectrum
+Nfft = length(outputCodes);
+fullscale = 2^15; fs = rx.SampleRate/4;
+win = kaiser(Nfft,100);
+win = win/sum(win);
+win = win*Nfft;
+outputCodes = double(outputCodes).*win;
+spec = fft(outputCodes) / Nfft;
+spec_db = 20*log10(abs(spec)/fullscale+10^-20);
+df = fs/Nfft; freqRangeRx = (-fs/2:df:fs/2-df).';
+plot(freqRangeRx,fftshift(spec_db));
+legend('CDDC0','CDDC1','CDDC2','CDDC3')
+xlabel('Frequency (Hz)');ylabel('Magnitude (dBFS)');
+```
+
+
+
+
diff --git a/CI/gen_doc/docs/models/ad9081/ddc2_images/figure_0.png b/CI/gen_doc/docs/models/ad9081/ddc2_images/figure_0.png
new file mode 100644
index 0000000..6f02b37
Binary files /dev/null and b/CI/gen_doc/docs/models/ad9081/ddc2_images/figure_0.png differ
diff --git a/CI/gen_doc/docs/models/ad9081/duc.tex.md b/CI/gen_doc/docs/models/ad9081/duc.tex.md
new file mode 100644
index 0000000..5c1f0f7
--- /dev/null
+++ b/CI/gen_doc/docs/models/ad9081/duc.tex.md
@@ -0,0 +1,104 @@
+# AD9081 Digital Up Converters
+
+
+The AD9081 has two sets of digital up converters (DUC), the coarse (CDUC) and fine (FDUC). These are used to both interpolate and move signals using the NCOs. They also can be used to phase shift and apply gain to the input signal.
+
+
+
+
+The CDUCs and FDUC are almost identical except for their available interpolations, allowable rates, and count. There are two CDUCs per DAC pair and four FDUCs per DAC pair. In the data pipeline, data from the input will be passed through the FDUCs, or bypass the FDUCs, then routed through a mux into the CDUCs, which can also be bypassed.
+
+
+# Top-Level Control
+
+
+The CDUC and FDUC interpolations are controlled by **MainDataPathInterpolation** and **ChannelizerPathInterpolation** respectively.
+
+
+
+```python
+help adi.sim.AD9081.Tx.MainDataPathInterpolation
+```
+
+
+```
+ MainDataPathInterpolation Main Data Path Interpolation
+ Specify the decimation in the main data path which can be
+ [1,2,3,4,6]
+```
+
+
+```python
+help adi.sim.AD9081.Tx.ChannelizerPathInterpolation
+```
+
+
+```
+ ChannelizerPathInterpolation Channelizer Path Interpolation
+ Specify the decimation in the channelizer path which can be
+ [1,2,3,4,6,8,12,16,24]
+```
+
+## Muxing
+
+
+The FDUC quads share a common full crossbar to the pairs of upstream CDUCs connected to them. This is represented by a single summing crossbar that limits routes to the halves of AD9081. This crossbar or mux is controlled by the **Crossbar8x8Mux** and will constrain all the mappings.
+
+
+
+```python
+help adi.sim.AD9081.Tx.Crossbar8x8Mux
+```
+
+
+```
+ Crossbar8x8Mux Crossbar 8x8 Mux
+ Logical 4x8 array of for MainDataPath input summers. Each row
+ corresponds to each summmer [1-4] and each column corresponds
+ to an input Channelizer path 1-8]. Set indexes to true to
+ enable a given path to be added into summer's output.
+```
+
+
+
+The 8x8 summing crossbar can sum any channels within the FDUC quads (FDUC0->FDUC3 and FDUC4->FDUC7). This is controlled by the columns of **Crossbar8x8Mux**, where each true row in a given column is feed into the individual summers feeding the inputs to the CDUCs. Below is an example of summing FDUC0,FDUC1,FDUC3 to CDDC0 and FDUC4,FDUC5 to CDDC2:
+
+
+
+```python
+tx = adi.sim.AD9081.Tx;
+tx.Crossbar8x8Mux = [...
+ 1,0,0,0,0,0,0,0;...FDUC0->CDUC0
+ 0,1,0,0,0,0,0,0;...FDUC1->CDUC1
+ 0,0,1,0,0,0,0,0;...FDUC2->CDUC2
+ 0,0,0,1,0,0,0,0]; %FDUC3->CDUC3
+```
+
+## NCO Frequency and Phase
+
+
+Once the NCOs are enabled the frequencies and phases of the NCOs can be controlled individually. This is done through the **CDUCNCOFrequencies, FDUCNCOFrequencies**, **CDUCNCOPhases**, and **FDUCNCOPhases**. The frequencies will be limited based on the rate going into the NCO at that stage.
+
+
+
+```python
+help adi.sim.AD9081.Tx.CDUCNCOFrequencies
+```
+
+
+```
+ CDUCNCOFrequencies CDUC NCO Frequencies
+ 1x4 Array of frequencies of NCOs in main data path
+```
+
+
+```python
+help adi.sim.AD9081.Tx.FDUCNCOFrequencies
+```
+
+
+```
+ FDUCNCOFrequencies FDUC NCO Frequencies
+ 1x8 Array of frequencies of NCOs in channelizer path
+```
+
diff --git a/CI/gen_doc/docs/models/ad9081/pfilt.tex.md b/CI/gen_doc/docs/models/ad9081/pfilt.tex.md
new file mode 100644
index 0000000..b8c435f
--- /dev/null
+++ b/CI/gen_doc/docs/models/ad9081/pfilt.tex.md
@@ -0,0 +1,91 @@
+# AD9081 Programmable FIR Filters (PFILT)
+
+
+Following the ADCs are the Programmable FIRs (PFILTs) that can operate at maximum rates of the RX paths. The PFILTs are useful for channel equalization, image rejection, and generic filtering. The PFILTs also act as muxes into the CDDCs connected downstream on the RX path.
+
+
+
+
+There are two PFILT blocks per AD9081 which operate on pairs of ADCs. The ADC pairs can be individually muxed based on requirements with Mux0
+
+
+# **Top-Level Control**
+
+
+RX has a pair of PFILT each which are denoted by PFilterX, where X is 1 or 2 in the property listing. Therefore RX will have properties: **PFilterXMode**, **PFilterXTaps**, and **PFilterXGains**.
+
+
+## Operational Modes and Features
+
+
+Each PFILT block is fundamentally a large 192 tap filter which can be split into:
+
+
+
+ - 1 192 tap filter
+ - 2 96 tap filters
+ - 3 64 tap filters (Matrix filter only)
+ - 4 48 tap filters
+
+
+
+The filters are individually mapped to pairs of ADCs on the RX side based on the mode used. The PFILTs have eight configuration modes and the following notation will be used to describe the filtering modes:
+
+
+
+ - x1: first input
+ - x2: second input
+ - y1: first output
+ - y2: second output
+ - F1: filter 1
+ - F2: filter 2
+ - F3: filter 3
+ - F4: filter 4
+ - p: length of filters (individually)
+
+
+
+The different operational modes selectable through the **PFilterXMode** property are:
+
+
+
+ - **NoFilter**: y1 = x1, y2 = x2, y3 = x2, y4 = x2
+ - **SingleInphase**: y1 = F1(x1), y2 = x2
+ - **SingleQuadrature**: y1 = x1, y2 = F1(x2)
+ - **DualReal**: y1 = F1(x1), y2 = F2(x2)
+ - **HalfComplexSumInphase**: y1 = F1(x1)+F2(x1), y2 = x2*z^-p
+ - **HalfComplexSumQuadrature**: y2 = F1(x1)+F2(x1), y1 = x1*z^-p
+ - **FullComplex**: y1 = F1(x1)-F3(x2), y2 = F1(x1)+F3(x2)-F2(x1+x2)
+ - **Matrix**: y1 = F1(x1) - F3(x2), y2 = F2(x1) - F4(x2)
+
+# Example Configuration
+
+
+Here is a basic example of a moving average filter applied on the RX path on one of the four ADCs.
+
+
+
+```python
+rx = adi.sim.AD9081.Rx;
+rx.PFIREnable = 1;
+rx.PFilter1Mode = 'SingleInphase';
+rx.PFilter2Mode = 'NoFilter';
+N = 48; rx.PFilter1Taps = [ones(1,N)./2^3,zeros(1,192-N)];
+rx.PFilter1TapsWidthsPerQuad = [...
+16,16,16,16,16,16,16,16,16,16,16,16,...
+12,12,12,12,12,12,12,12,12,12,12,12,...
+6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6];...
+rampVolts = 1.0*[(1./1e3.*(1:1e3)).';(1./1e3.*(1e3:-1:1)).'];
+rampVolts = randn(size(rampVolts))./16+rampVolts;
+[out1,out2,~,~,out3,out4] = rx(rampVolts,rampVolts,rampVolts,rampVolts);
+outs = [out1,out2,out3,out4];
+n = 1:2e3;
+subplot(2,1,1);plot(n,real(outs(:,1)));title("Moving Average Filter")
+subplot(2,1,2);plot(n,real(outs(:,2)));title("No Filter")
+```
+
+
+
+
diff --git a/CI/gen_doc/docs/models/ad9081/pfilt_images/figure_0.png b/CI/gen_doc/docs/models/ad9081/pfilt_images/figure_0.png
new file mode 100644
index 0000000..b4cc5aa
Binary files /dev/null and b/CI/gen_doc/docs/models/ad9081/pfilt_images/figure_0.png differ
diff --git a/CI/gen_doc/docs/models/ad9081/top_level.tex.md b/CI/gen_doc/docs/models/ad9081/top_level.tex.md
new file mode 100644
index 0000000..40f804b
--- /dev/null
+++ b/CI/gen_doc/docs/models/ad9081/top_level.tex.md
@@ -0,0 +1,183 @@
+# AD9081 Behavioral Model Introduction
+
+
+The AD9081 is a highly integrated RF mixed-signal front-end (MxFE) that features four 16-bit, 12 GSPS DAC cores and four 12-bit, 4 GSPS ADC cores, as shown below:
+
+
+
+
+
+
+
+
+
+The device includes an optional on-chip clock multiplier (up to 12GHz) for DAC and ADC sampling clock generation as well as broadband ADC and DAC cores.
+
+
+
+
+The transmit and receive digital datapaths are highly configurable and support a wide range of single-band and multiband applications with varying RF bandwidth requirements. The AD9081 transmit and receive datapaths consist of four main datapaths in support of wideband signals and eight channelizers in support of narrower band signals. For multiband applications with wide separation between RF bands, the channelizers can be used to process the individual RF bands to reduce the overall complex data rate needed to represent each narrower band. Both the main and channelizer datapath stages offer flexible interpolating and decimation factors to allow a more manageable data interface rate aligned to the actual signal bandwidth requirements. The numerically controlled oscillator of each stage can be independently tuned for maximum flexibility.
+
+
+
+
+The models available in the High-Speed Converter Toolbox are designed to educate users on the configuration, features, and limitations of the AD9081. However, it should not be expected to match hardware exactly, but be similar in behavior. It should not be used for exact performance measurements.
+
+
+
+
+The device model is split into two components, one modeling the transmit path and one for the receive path. Both are [System Objects](https://www.mathworks.com/help/matlab/matlab_prog/what-are-system-objects.html) and have methods and properties to allow configuration and passing of data into the models. For details on the different features select from the links below. For a basic overview of the models go to the \hyperref{H_C9E8316D}{Quick Start} section below.
+
+
+
+ - [ADC and ADC Mux](../adc.tex)
+ - [DAC](../dac.tex)
+ - [Programmable FIR Filters (PFILT)](../pfilt.tex)
+ - [Digital Down Converters](../ddc2.tex)
+ - [Digital Up Converters](../duc.tex)
+
+# Model Limitations
+
+
+The models are primarily designed to expose the DSP features of AD9081 and the different configurations possible. This does not include the JESD interfaces or highly detailed implementation of the ADCs or DACs within the device. However, the converter models will have similar NSD performance of the device.
+
+
+# Quick Start
+
+
+Each TX and RX model instance can be instantiated like any other System Object in MATLAB through the constructor call. The constructor can be used to parameterize the model but it is typically more understandable to do this separately from the constructor as below:
+
+
+
+```python
+rx = adi.sim.AD9081.Rx; % Call constructor of Receiver model
+rx.MainDataPathDecimation = 4; % Set CDDC decimation to 4
+
+% Call constructor with arguments
+rx = adi.sim.AD9081.Rx('MainDataPathDecimation',4);
+```
+
+
+
+The receiver model has dozens of properties and are set in a similar way to the above **MainDataPathDecimation**. These properties are validated when update and at runtime so the model will not run in an undefined mode.
+
+
+
+
+On receive, the input data is assumed to be in *volts* and the output of the model will be in *codes*. Note that these are not strictly ADC codes depending on what processing is enable inside.
+
+
+
+
+We can demonstrate a typical usage flow of the receiver through a few examples. In the below example feeds a 50% fullscale and 110% fullscale signal into the four ADCs in the form of a matrix. The input to the RX model must always be a 4 real Nx1 arrays of type double, representing the input to each ADC. N must be a multiple of the total decimation enable and should be relatively large for performance reasons.
+
+
+
+```python
+rx = adi.sim.AD9081.Rx;
+% Create sinewave at 50% FSR
+sw = dsp.SineWave;
+sw.Amplitude = 0.125; % volts
+sw.Frequency = 10e6;
+sw.SampleRate = rx.SampleRate;
+sw.SamplesPerFrame = 4e4;
+data = sw();
+outputCodes = rx(data.*0.5,data.*0.5,data.*0.5,data.*1.1);
+% Plots
+plot(real(outputCodes));xlabel('Sample');ylabel('Code');
+```
+
+
+
+
+
+
+On the TX side the usage model is the same, but we are instead passing integers to be transmitted from the DACs and the outputs are codes to the relative fullscale of the DAC which is 16-bits.
+
+
+
+```python
+tx = adi.sim.AD9081.Tx;
+tx.MainDataPathInterpolation = 2;
+tx.ModeSelectMux = 0; % Set DAC inputs to real data from CDUCs.
+
+% Create sinewave at 50% and 25% FSR
+sw = dsp.SineWave;
+sw.Amplitude = 2^15*0.5; % codes
+sw.Frequency = 10e6;
+sw.SampleRate = rx.SampleRate;
+sw.SamplesPerFrame = 4e4;
+dataS = sw();
+data = int16(dataS);dataHalf = int16(dataS.*0.5);
+[outputCodes0,~,~,outputCodes3] = tx(data,data,data,dataHalf,data,data,data,data);
+% Plots
+plot(real(outputCodes0)); hold on;
+plot(real(outputCodes3)); hold off;
+xlabel('Sample');ylabel('Code');
+```
+
+
+
+
+## Inspecting Properties
+
+
+When using the model individual properties can be inspected for their functionality. Leveraging the **help** command will print out useful information on each setting. Follow the patterns below to perform lookups:
+
+
+
+```python
+help adi.sim.AD9081.Rx.MainDataPathDecimation
+```
+
+
+```
+ MainDataPathDecimation Main Data Path Decimation
+ Specify the decimation in the main data path which can be
+ [1,2,3,4,6]
+```
+
+
+```python
+rx = adi.sim.AD9081.Rx
+```
+
+
+```
+rx =
+ adi.sim.AD9081.Rx with properties:
+
+ CDDCNCOFrequencies: [1000000 1000000 1000000 1000000]
+ CDDCNCOEnable: [0 0 0 0]
+ FDDCNCOFrequencies: [1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000]
+ FDDCNCOEnable: [0 0 0 0 0 0 0 0]
+ MainDataPathDecimation: 1
+ ChannelizerPathDecimation: 1
+ Crossbar4x4Mux0: [1 2 3 4]
+ Crossbar4x8Mux2: [1 2 1 2 3 4 3 4]
+ PFIREnable: false
+ ModeSelectMux1: false
+ SampleRate: 4.0000e+09
+
+```
+
+
+```python
+help rx.MainDataPathDecimation
+```
+
+
+```
+--- help for adi.sim.AD9081.Rx/MainDataPathDecimation ---
+
+ MainDataPathDecimation Main Data Path Decimation
+ Specify the decimation in the main data path which can be
+ [1,2,3,4,6]
+```
+
diff --git a/CI/gen_doc/docs/models/ad9081/top_level_images/figure_0.png b/CI/gen_doc/docs/models/ad9081/top_level_images/figure_0.png
new file mode 100644
index 0000000..141fd95
Binary files /dev/null and b/CI/gen_doc/docs/models/ad9081/top_level_images/figure_0.png differ
diff --git a/CI/gen_doc/docs/models/ad9081/top_level_images/figure_1.png b/CI/gen_doc/docs/models/ad9081/top_level_images/figure_1.png
new file mode 100644
index 0000000..9ba3c2e
Binary files /dev/null and b/CI/gen_doc/docs/models/ad9081/top_level_images/figure_1.png differ
diff --git a/CI/gen_doc/docs/models/ad9081/top_level_images/image_0.png b/CI/gen_doc/docs/models/ad9081/top_level_images/image_0.png
new file mode 100644
index 0000000..dfafe74
Binary files /dev/null and b/CI/gen_doc/docs/models/ad9081/top_level_images/image_0.png differ
diff --git a/CI/gen_doc/docs/ports.json b/CI/gen_doc/docs/ports.json
new file mode 100644
index 0000000..278ae32
--- /dev/null
+++ b/CI/gen_doc/docs/ports.json
@@ -0,0 +1,178 @@
+{
+ "ad7380": {
+ "chip": "AD7380",
+ "complex": "false",
+ "fpga": [
+ "zcu102"
+ ],
+ "supported_rd": [
+ "rx"
+ ],
+ "ports": [
+ {
+ "rx": [
+ {
+ "input": "false",
+ "width": 1,
+ "name": "axi_ad9680_cpack/fifo_wr_en",
+ "type": "valid"
+ },
+ {
+ "input": "true",
+ "width": 1,
+ "name": "axi_ad9680_tpl/adc_valid_0",
+ "type": "valid"
+ },
+ {
+ "input": "false",
+ "width": 64,
+ "name": "axi_ad9680_cpack/fifo_wr_data_0",
+ "type": "data"
+ },
+ {
+ "input": "false",
+ "width": 64,
+ "name": "axi_ad9680_cpack/fifo_wr_data_1",
+ "type": "data"
+ },
+ {
+ "input": "true",
+ "width": 64,
+ "name": "axi_ad9680_tpl/adc_data_0",
+ "type": "data"
+ },
+ {
+ "input": "true",
+ "width": 64,
+ "name": "axi_ad9680_tpl/adc_data_1",
+ "type": "data"
+ }
+ ]
+ }
+ ]
+ },
+ "ad7768": {
+ "chip": "AD7768",
+ "complex": "false",
+ "fpga": [
+ "zcu102"
+ ],
+ "supported_rd": [
+ "rx"
+ ],
+ "ports": [
+ {
+ "rx": [
+ {
+ "input": "false",
+ "width": 1,
+ "name": "util_mxfe_cpack/fifo_wr_en",
+ "type": "valid"
+ },
+ {
+ "input": "true",
+ "width": 1,
+ "name": "rx_mxfe_tpl_core/adc_valid_0",
+ "type": "valid"
+ },
+ {
+ "input": "false",
+ "width": 16,
+ "name": "util_mxfe_cpack/fifo_wr_data_0",
+ "type": "data"
+ },
+ {
+ "input": "false",
+ "width": 16,
+ "name": "util_mxfe_cpack/fifo_wr_data_1",
+ "type": "data"
+ },
+ {
+ "input": "false",
+ "width": 16,
+ "name": "util_mxfe_cpack/fifo_wr_data_2",
+ "type": "data"
+ },
+ {
+ "input": "false",
+ "width": 16,
+ "name": "util_mxfe_cpack/fifo_wr_data_3",
+ "type": "data"
+ },
+ {
+ "input": "false",
+ "width": 16,
+ "name": "util_mxfe_cpack/fifo_wr_data_4",
+ "type": "data"
+ },
+ {
+ "input": "false",
+ "width": 16,
+ "name": "util_mxfe_cpack/fifo_wr_data_5",
+ "type": "data"
+ },
+ {
+ "input": "false",
+ "width": 16,
+ "name": "util_mxfe_cpack/fifo_wr_data_6",
+ "type": "data"
+ },
+ {
+ "input": "false",
+ "width": 16,
+ "name": "util_mxfe_cpack/fifo_wr_data_7",
+ "type": "data"
+ },
+ {
+ "input": "true",
+ "width": 16,
+ "name": "rx_mxfe_tpl_core/adc_data_0",
+ "type": "data"
+ },
+ {
+ "input": "true",
+ "width": 16,
+ "name": "rx_mxfe_tpl_core/adc_data_1",
+ "type": "data"
+ },
+ {
+ "input": "true",
+ "width": 16,
+ "name": "rx_mxfe_tpl_core/adc_data_2",
+ "type": "data"
+ },
+ {
+ "input": "true",
+ "width": 16,
+ "name": "rx_mxfe_tpl_core/adc_data_3",
+ "type": "data"
+ },
+ {
+ "input": "true",
+ "width": 16,
+ "name": "rx_mxfe_tpl_core/adc_data_4",
+ "type": "data"
+ },
+ {
+ "input": "true",
+ "width": 16,
+ "name": "rx_mxfe_tpl_core/adc_data_5",
+ "type": "data"
+ },
+ {
+ "input": "true",
+ "width": 16,
+ "name": "rx_mxfe_tpl_core/adc_data_6",
+ "type": "data"
+ },
+ {
+ "input": "true",
+ "width": 16,
+ "name": "rx_mxfe_tpl_core/adc_data_7",
+ "type": "data"
+ }
+ ]
+ }
+ ]
+ }
+}
diff --git a/CI/gen_doc/docs/read_ports_json.py b/CI/gen_doc/docs/read_ports_json.py
new file mode 100644
index 0000000..7d6a695
--- /dev/null
+++ b/CI/gen_doc/docs/read_ports_json.py
@@ -0,0 +1,59 @@
+import json
+
+# open ports.json file and parse
+ports_json_file = 'ports.json'
+with open(ports_json_file) as json_file:
+ ports = json.load(json_file)
+
+ tmp_key = "m_name"
+ for key0 in ports.keys():
+ for key1 in ports[key0]['ports'][0].keys():
+ if (key1 == "rx"):
+ for ii in range(0, len(ports[key0]['ports'][0][key1])):
+ tmp_dict = ports[key0]['ports'][0][key1][ii]
+ if (tmp_dict['type'].lower() == "data"):
+ if (tmp_dict['input'] == "true"):
+ if tmp_key not in tmp_dict:
+ tmp_list = tmp_dict['name'].split("_")
+ last_ele = tmp_list[-1]
+ if (len(last_ele) == 1):
+ tmp_dict[tmp_key] = f"{ports[key0]['chip']} ADC Data {last_ele} IN"
+ elif (len(last_ele) == 2):
+ tmp_dict[tmp_key] = f"{ports[key0]['chip']} ADC Data {last_ele.upper()}"
+ elif (tmp_dict['input'] == "false"):
+ if tmp_key not in tmp_dict:
+ tmp_list = tmp_dict['name'].split("_")
+ last_ele = tmp_list[-1]
+ tmp_dict[tmp_key] = f"IP Data {last_ele.upper()} OUT"
+ elif (tmp_dict['type'].lower() == "valid"):
+ if (tmp_dict['input'] == "true"):
+ tmp_dict[tmp_key] = f"IP Valid Rx Data IN"
+ elif (tmp_dict['input'] == "false"):
+ tmp_dict[tmp_key] = f"IP Data Valid OUT"
+ ports[key0]['ports'][0][key1][ii] = tmp_dict
+ elif (key1 == "tx"):
+ for ii in range(0, len(ports[key0]['ports'][0][key1])):
+ tmp_dict = ports[key0]['ports'][0][key1][ii]
+ if (tmp_dict['type'].lower() == "data"):
+ if (tmp_dict['input'] == "false"):
+ if tmp_key not in tmp_dict:
+ tmp_list = tmp_dict['name'].split("_")
+ last_ele = tmp_list[-1]
+ if (len(last_ele) == 1):
+ tmp_dict[tmp_key] = f"{ports[key0]['chip']} DAC Data {last_ele} OUT"
+ elif (len(last_ele) == 2):
+ tmp_dict[tmp_key] = f"{ports[key0]['chip']} DAC Data {last_ele.upper()}"
+ elif (tmp_dict['input'] == "true"):
+ if tmp_key not in tmp_dict:
+ tmp_list = tmp_dict['name'].split("_")
+ last_ele = tmp_list[-1]
+ tmp_dict[tmp_key] = f"IP Data {last_ele.upper()} IN"
+ elif (tmp_dict['type'].lower() == "valid"):
+ if (tmp_dict['input'] == "true"):
+ tmp_dict[tmp_key] = f"IP Valid Tx Data IN"
+ elif (tmp_dict['input'] == "false"):
+ tmp_dict[tmp_key] = f"IP Load Tx Data OUT"
+ ports[key0]['ports'][0][key1][ii] = tmp_dict
+
+with open(ports_json_file, 'w') as json_file:
+ json.dump(ports, json_file, indent = 4)
\ No newline at end of file
diff --git a/CI/gen_doc/docs/stylesheets/ml_style.css b/CI/gen_doc/docs/stylesheets/ml_style.css
new file mode 100644
index 0000000..fcb16d6
--- /dev/null
+++ b/CI/gen_doc/docs/stylesheets/ml_style.css
@@ -0,0 +1,7 @@
+.md-header {
+ display: none;
+}
+
+.md-footer {
+ display: none;
+}
\ No newline at end of file
diff --git a/CI/gen_doc/docs/stylesheets/rd_style.css b/CI/gen_doc/docs/stylesheets/rd_style.css
new file mode 100644
index 0000000..a147ed4
--- /dev/null
+++ b/CI/gen_doc/docs/stylesheets/rd_style.css
@@ -0,0 +1,217 @@
+
+#CarrierBox > rect {
+ fill: var(--md-default-fg-color--light);
+}
+#AXIAD9361Box > rect {
+ stroke: white;
+}
+
+#AXIAD9361Box:hover > rect {
+ fill: rgb(0, 174, 255);
+}
+#TxDMAEngineBox > rect {
+ stroke: white;
+}
+
+#TxDMAEngineBox:hover > rect {
+ fill: rgb(0, 174, 255);
+}
+#TxUPACKBox > rect {
+ stroke: white;
+}
+
+#TxUPACKBox:hover > rect {
+ fill: rgb(0, 174, 255);
+}
+#TxFIFOBox > rect {
+ stroke: white;
+}
+
+#TxFIFOBox:hover > rect {
+ fill: rgb(0, 174, 255);
+}
+#RxDMAEngineBox > rect {
+ stroke: white;
+}
+
+#RxDMAEngineBox:hover > rect {
+ fill: rgb(0, 174, 255);
+}
+#CPACKBox > rect {
+ stroke: white;
+}
+
+#CPACKBox:hover > rect {
+ fill: rgb(0, 174, 255);
+}
+#RxFIFOBox > rect {
+ stroke: white;
+}
+
+#RxFIFOBox:hover > rect {
+ fill: rgb(0, 174, 255);
+}
+
+#FPGACarrierText {
+ fill: var(--rd-title-color);
+}
+
+#CarrierBox > rect {
+ fill: none;
+ stroke: black
+}
+
+#CustomIPOutline > rect {
+ stroke: var(--rd-title-color);
+}
+
+#CustomIPIntegrationText {
+ fill: var(--rd-title-color);
+}
+
+#CarrierBox > rect {
+ fill: var(--md-default-fg-color--light);
+}
+#TxDMAEngineBox > rect {
+ stroke: white;
+}
+
+#TxDMAEngineBox:hover > rect {
+ fill: rgb(0, 174, 255);
+}
+#TxUPACKBox > rect {
+ stroke: white;
+}
+
+#TxUPACKBox:hover > rect {
+ fill: rgb(0, 174, 255);
+}
+#RxDMAEngineBox > rect {
+ stroke: white;
+}
+
+#RxDMAEngineBox:hover > rect {
+ fill: rgb(0, 174, 255);
+}
+#CPACKBox > rect {
+ stroke: white;
+}
+
+#CPACKBox:hover > rect {
+ fill: rgb(0, 174, 255);
+}
+#AXIADRV9002Box > rect {
+ stroke: white;
+}
+
+#AXIADRV9002Box:hover > rect {
+ fill: rgb(0, 174, 255);
+}
+
+#FPGACarrierText {
+ fill: var(--rd-title-color);
+}
+
+#CarrierBox > rect {
+ fill: none;
+ stroke: black
+}
+
+#CustomIPOutline > rect {
+ stroke: var(--rd-title-color);
+}
+
+#CustomIPIntegrationText {
+ fill: var(--rd-title-color);
+}
+
+#CarrierBox > rect {
+ fill: var(--md-default-fg-color--light);
+}
+#TxDMAEngineBox > rect {
+ stroke: white;
+}
+
+#TxDMAEngineBox:hover > rect {
+ fill: rgb(0, 174, 255);
+}
+#TxUPACKBox > rect {
+ stroke: white;
+}
+
+#TxUPACKBox:hover > rect {
+ fill: rgb(0, 174, 255);
+}
+#RxDMAEngineBox > rect {
+ stroke: white;
+}
+
+#RxDMAEngineBox:hover > rect {
+ fill: rgb(0, 174, 255);
+}
+#CPACKBox > rect {
+ stroke: white;
+}
+
+#CPACKBox:hover > rect {
+ fill: rgb(0, 174, 255);
+}
+#RxJESDTPL > rect {
+ stroke: white;
+}
+
+#RxJESDTPL:hover > rect {
+ fill: rgb(0, 174, 255);
+}
+#RxJESDLink > rect {
+ stroke: white;
+}
+
+#RxJESDLink:hover > rect {
+ fill: rgb(0, 174, 255);
+}
+#RxJESDPHY > rect {
+ stroke: white;
+}
+
+#RxJESDPHY:hover > rect {
+ fill: rgb(0, 174, 255);
+}
+#TxJESDTPL > rect {
+ stroke: white;
+}
+
+#TxJESDTPL:hover > rect {
+ fill: rgb(0, 174, 255);
+}
+#TxJESDLink > rect {
+ stroke: white;
+}
+
+#TxJESDLink:hover > rect {
+ fill: rgb(0, 174, 255);
+}
+#TxJESDPHY > rect {
+ stroke: white;
+}
+
+#TxJESDPHY:hover > rect {
+ fill: rgb(0, 174, 255);
+}
+
+#FPGACarrierText {
+ fill: var(--rd-title-color);
+}
+
+#CarrierBox > rect {
+ fill: none;
+ stroke: black
+}
+
+#CustomIPOutline > rect {
+ stroke: var(--rd-title-color);
+}
+
+#CustomIPIntegrationText {
+ fill: var(--rd-title-color);
+}
diff --git a/CI/gen_doc/docs/stylesheets/style.css b/CI/gen_doc/docs/stylesheets/style.css
new file mode 100644
index 0000000..86b7539
--- /dev/null
+++ b/CI/gen_doc/docs/stylesheets/style.css
@@ -0,0 +1,88 @@
+:root > * {
+ --md-primary-fg-color: #0370B8;
+ --md-primary-fg-color--light: #0370B8;
+ --md-primary-fg-color--dark: #0370B8;
+}
+
+[data-md-color-scheme="slate"] {
+ --prop-box-color: var(--md-code-bg-color);
+ --logo-light-mode: none;
+ --logo-dark-mode: block;
+ --rd-title-color: white;
+}
+
+[data-md-color-scheme="default"] {
+ --prop-box-color: #f1f1f1;
+ --prop-box-color: var(--md-default-fg-color--dark);
+ --logo-light-mode: block;
+ --logo-dark-mode: none;
+ --rd-title-color: black;
+}
+
+
+.sysobj_desc_title {
+ border-bottom: 1px solid rgb(153, 153, 153);
+ margin-bottom: 10px;
+}
+
+.property {
+ margin: 16px;
+}
+
+/* Style the button that is used to open and close the collapsible content */
+.collapsible-property {
+ background-color: #eee;
+ color: #444;
+ cursor: pointer;
+ padding: 18px;
+ width: 100%;
+ border: rgb(153, 153, 153) 1px solid;
+ text-align: left;
+ outline: none;
+ font-size: 15px;
+ border-radius: 3px;
+}
+
+/* Add a background color to the button if it is clicked on (add the .active class with JS), and when you move the mouse over it (hover) */
+.active,
+.collapsible-property:hover {
+ background-color: #ccc;
+}
+
+/* Style the collapsible content. Note: hidden by default */
+.content {
+ padding: 0 18px;
+ display: none;
+ overflow: hidden;
+ background-color: var(--prop-box-color);
+ border-radius: 0px;
+ border-bottom-left-radius: 3px;
+ border-bottom-right-radius: 3px;
+ border: rgb(153, 153, 153) 1px solid;
+}
+
+.screenshot {
+ box-shadow: 0px 6px 5px #ccc;
+ width: 80%;
+}
+
+/* Logo dark/light */
+.dark-logo {
+ display: var(--logo-light-mode);
+}
+
+.light-logo {
+ display: var(--logo-dark-mode);
+}
+
+:root {
+ --md-primary-fg-color: #1E68D8;
+ --md-primary-fg-color--light: #1E68D8;
+ --md-primary-fg-color--dark: #1E68D8;
+}
+
+[data-md-color-scheme="blue"] {
+ --md-primary-fg-color: #1E68D8;
+ --md-primary-fg-color--light: #1E68D8;
+ --md-primary-fg-color--dark: #1E68D8;
+}
diff --git a/CI/gen_doc/docs/sysobjects/.pages b/CI/gen_doc/docs/sysobjects/.pages
new file mode 100644
index 0000000..7835617
--- /dev/null
+++ b/CI/gen_doc/docs/sysobjects/.pages
@@ -0,0 +1 @@
+title: Device Interfaces
diff --git a/CI/gen_doc/docs/sysobjects/adi.AD9081.Rx.md b/CI/gen_doc/docs/sysobjects/adi.AD9081.Rx.md
new file mode 100644
index 0000000..d0eb6ed
--- /dev/null
+++ b/CI/gen_doc/docs/sysobjects/adi.AD9081.Rx.md
@@ -0,0 +1,125 @@
+---
+hide:
+ - navigation
+ - toc
+---
+
+
+
+
+
+
+
+
+
+ The adi.AD9081.Rx System object is a signal source that can receive complex data from the AD9081.
+
+The class can be instantiated in the following way with and without property name value pairs.
+
+```matlab
+dev = adi.AD9081.Rx
+dev = adi.AD9081.Rx(Name, Value)
+```
+
+
Properties
+
+
+
+Unless otherwise indicated, properties are non-tunable, which means you cannot change their values after calling the object. Objects lock when you call them, and the release function unlocks them.
+
+If a property is tunable, you can change its value at any time.
+
Baseband sampling rate in Hz, specified as a scalar in samples per second. This value is only readable once connected to hardware
+
+
+
+
+
+
Frequency of NCO in fine decimators in receive path. Property must be a [1,N] vector where each value is the frequency of an NCO in hertz, and N is the number of channels available.
+
+
+
+
+
+
Frequency of NCO in fine decimators in receive path. Property must be a [1,N] vector where each value is the frequency of an NCO in hertz, and N is the number of channels available.
+
+
+
+
+
+
Frequency of NCO in fine decimators in receive path. Property must be a [1,N] vector where each value is the frequency of an NCO in hertz, and N is the number of channels available.
+
+
+
+
+
+
Frequency of NCO in fine decimators in receive path. Property must be a [1,N] vector where each value is the frequency of an NCO in hertz, and N is the number of channels available.
+
+
+
+
+
+
Test mode of receive path. Options are: 'off' 'midscale_short' 'pos_fullscale' 'neg_fullscale' 'checkerboard' 'pn9' 'pn32' 'one_zero_toggle' 'user' 'pn7' 'pn15' 'pn31' 'ramp'
+
+
+
+
+
+
Enable use of PFIR/PFILT filters
+
+
+
+
+
+
Path(s) to FPIR/PFILT filter file(s). Input can be a string or cell array of strings. Files are loading in order
+
+
+
+
+
+
Number of samples per frame, specified as an even positive integer from 2 to 16,777,216. Using values less than 3660 can yield poor performance.Help for adi.AD9081.Rx/SamplesPerFrame is inherited from superclass ADI.AD9081.BASE
+
+
+
+
+
+
Indexs of channels to be enabled. Input should be a [1xN] vector with the indexes of channels to be enabled. Order is irrelevant
+
+
+
+
+
+
Hostname or IP address of remote libIIO deviceHelp for adi.AD9081.Rx/uri is inherited from superclass MATLABSHARED.LIBIIO.BASE
+
+
+
+
Example Usage
+
+```
+
+%% Rx set up
+rx = adi.adi.AD9081.Rx.Rx('uri','ip:analog.local');
+rx.CenterFrequency = 1e9;
+rx.EnabledChannels = 1;
+%% Run
+for k=1:10
+ valid = false;
+ while ~valid
+ [out, valid] = rx();
+ end
+end
+
+```
\ No newline at end of file
diff --git a/CI/gen_doc/docs/sysobjects/adi.AD9081.Tx.md b/CI/gen_doc/docs/sysobjects/adi.AD9081.Tx.md
new file mode 100644
index 0000000..6b61fdf
--- /dev/null
+++ b/CI/gen_doc/docs/sysobjects/adi.AD9081.Tx.md
@@ -0,0 +1,148 @@
+---
+hide:
+ - navigation
+ - toc
+---
+
+
+
+
+
+
+
+
+
+ The adi.AD9081.Tx System object is a signal sink that can tranmsit complex data from the AD9081.
+
+The class can be instantiated in the following way with and without property name value pairs.
+
+```matlab
+dev = adi.AD9081.Tx
+dev = adi.AD9081.Tx(Name, Value)
+```
+
+
Properties
+
+
+
+Unless otherwise indicated, properties are non-tunable, which means you cannot change their values after calling the object. Objects lock when you call them, and the release function unlocks them.
+
+If a property is tunable, you can change its value at any time.
+
Frequency of NCO in fine decimators in transmit path. Property must be a [1,N] vector where each value is the frequency of an NCO in hertz.
+
+
+
+
+
+
Frequency of NCO in fine decimators in transmit path. Property must be a [1,N] vector where each value is the frequency of an NCO in hertz.
+
+
+
+
+
+
Frequency of NCO in fine decimators in transmit path. Property must be a [1,N] vector where each value is the frequency of an NCO in hertz.
+
+
+
+
+
+
Frequency of NCO in fine decimators in transmit path. Property must be a [1,N] vector where each value is the frequency of an NCO in hertz.
+
+
+
+
+
+
Frequency of NCO in fine decimators in transmit path. Property must be a [1,N] vector where each value is the frequency of an NCO in hertz.
+
+
+
+
+
+
Vector of logicals which enabled individual NCOs in channel interpolators
+
+
+
+
+
+
Number of samples per frame, specified as an even positive integer from 2 to 16,777,216. Using values less than 3660 can yield poor performance.Help for adi.AD9081.Tx/SamplesPerFrame is inherited from superclass ADI.AD9081.BASE
+
+
+
+
+
+
Indexs of channels to be enabled. Input should be a [1xN] vector with the indexes of channels to be enabled. Order is irrelevant
+
+
+
+
+
+
Hostname or IP address of remote libIIO deviceHelp for adi.AD9081.Tx/uri is inherited from superclass MATLABSHARED.LIBIIO.BASE
+
+
+
+
+
+
Data source, specified as one of the following: 'DMA' — Specify the host as the source of the data. 'DDS' — Specify the DDS on the radio hardware as the source of the data. In this case, each channel has two additive tones.Help for adi.AD9081.Tx/DataSource is inherited from superclass ADI.COMMON.DDS
+
+
+
+
+
+
Frequencies values in Hz of the DDS tone generators. For complex data devices the input is a [2xN] matrix where N is the available channels on the board. For complex data devices this is at most max(EnabledChannels)*2. For non-complex data devices this is at most max(EnabledChannels). If N < this upper limit, other DDSs are not set.Help for adi.AD9081.Tx/DDSFrequencies is inherited from superclass ADI.COMMON.DDS
+
+
+
+
+
+
Scale of DDS tones in range [0,1]. For complex data devices the input is a [2xN] matrix where N is the available channels on the board. For complex data devices this is at most max(EnabledChannels)*2. For non-complex data devices this is at most max(EnabledChannels). If N < this upper limit, other DDSs are not set.Help for adi.AD9081.Tx/DDSScales is inherited from superclass ADI.COMMON.DDS
+
+
+
+
+
+
Phases of DDS tones in range [0,360000]. For complex data devices the input is a [2xN] matrix where N is the available channels on the board. For complex data devices this is at most max(EnabledChannels)*2. For non-complex data devices this is at most max(EnabledChannels). If N < this upper limit, other DDSs are not set.Help for adi.AD9081.Tx/DDSPhases is inherited from superclass ADI.COMMON.DDS
+
+
+
+
+
+
Enable Cyclic Buffers, configures transmit buffers to be cyclic, which makes them continuously repeatHelp for adi.AD9081.Tx/EnableCyclicBuffers is inherited from superclass ADI.COMMON.DDS
+
+The class can be instantiated in the following way with and without property name value pairs.
+
+```matlab
+dev = adi.AD9467.Rx
+dev = adi.AD9467.Rx(Name, Value)
+```
+
+
Properties
+
+
+
+Unless otherwise indicated, properties are non-tunable, which means you cannot change their values after calling the object. Objects lock when you call them, and the release function unlocks them.
+
+If a property is tunable, you can change its value at any time.
+
Scale received data. Possible options are: 0.030517 0.032043 0.033569 0.035095 0.036621 0.038146
+
+
+
+
+
+
Number of samples per frame, specified as an even positive integer from 2 to 16,777,216. Using values less than 3660 can yield poor performance.Help for adi.AD9467.Rx/SamplesPerFrame is inherited from superclass ADI.AD9467.BASE
+
+
+
+
+
+
Indexs of channels to be enabled. Input should be a [1xN] vector with the indexes of channels to be enabled. Order is irrelevant
+
+
+
+
+
+
Hostname or IP address of remote libIIO deviceHelp for adi.AD9467.Rx/uri is inherited from superclass MATLABSHARED.LIBIIO.BASE
+
+
+
+
Example Usage
+
+```
+
+%% Rx set up
+rx = adi.adi.AD9467.Rx.Rx('uri','ip:analog.local');
+rx.CenterFrequency = 1e9;
+rx.EnabledChannels = 1;
+%% Run
+for k=1:10
+ valid = false;
+ while ~valid
+ [out, valid] = rx();
+ end
+end
+
+```
\ No newline at end of file
diff --git a/CI/gen_doc/docs/sysobjects/adi.DAQ2.Rx.md b/CI/gen_doc/docs/sysobjects/adi.DAQ2.Rx.md
new file mode 100644
index 0000000..0d4422f
--- /dev/null
+++ b/CI/gen_doc/docs/sysobjects/adi.DAQ2.Rx.md
@@ -0,0 +1,101 @@
+---
+hide:
+ - navigation
+ - toc
+---
+
+
+
+
+
+
+
+
+
+ The adi.DAQ2.Rx System object is a signal source that can receive complex data from the DAQ2.
+
+The class can be instantiated in the following way with and without property name value pairs.
+
+```matlab
+dev = adi.DAQ2.Rx
+dev = adi.DAQ2.Rx(Name, Value)
+```
+
+
Properties
+
+
+
+Unless otherwise indicated, properties are non-tunable, which means you cannot change their values after calling the object. Objects lock when you call them, and the release function unlocks them.
+
+If a property is tunable, you can change its value at any time.
+
Baseband sampling rate in Hz, specified as a scalar in samples per second. This value is constantHelp for adi.DAQ2.Rx.SamplingRate is inherited from superclass ADI.AD9680.RX
+
+
+
+
+
+
Indexs of channels to be enabled. Input should be a [1xN] vector with the indexes of channels to be enabled. Order is irrelevant
+
+
+
+
+
+
Hostname or IP address of remote libIIO deviceHelp for adi.DAQ2.Rx/uri is inherited from superclass MATLABSHARED.LIBIIO.BASE
+
+
+
+
+
+
Number of samples per frame, specified as an even positive integer from 2 to 16,777,216. Using values less than 3660 can yield poor performance.Help for adi.DAQ2.Rx/SamplesPerFrame is inherited from superclass ADI.AD9680.BASE
+
+
+
+
+
+
The number of buffers allocated in the kernel for data transfersHelp for adi.DAQ2.Rx/kernelBuffersCount is inherited from superclass MATLABSHARED.LIBIIO.BASE
+
+
+
+
+
+
A String Representing the data typeHelp for adi.DAQ2.Rx/dataTypeStr is inherited from superclass MATLABSHARED.LIBIIO.BASE
+
+
+
+
+
+
Number of samples per frame, specified as an even positive integer from 2 to 16,777,216. Using values less than 3660 can yield poor performance.Help for adi.DAQ2.Rx/SamplesPerFrame is inherited from superclass ADI.AD9680.BASE
+
+
+
+
Example Usage
+
+```
+
+%% Rx set up
+rx = adi.adi.DAQ2.Rx.Rx('uri','ip:analog.local');
+rx.CenterFrequency = 1e9;
+rx.EnabledChannels = 1;
+%% Run
+for k=1:10
+ valid = false;
+ while ~valid
+ [out, valid] = rx();
+ end
+end
+
+```
\ No newline at end of file
diff --git a/CI/gen_doc/docs/sysobjects/adi.DAQ2.Tx.md b/CI/gen_doc/docs/sysobjects/adi.DAQ2.Tx.md
new file mode 100644
index 0000000..932412e
--- /dev/null
+++ b/CI/gen_doc/docs/sysobjects/adi.DAQ2.Tx.md
@@ -0,0 +1,136 @@
+---
+hide:
+ - navigation
+ - toc
+---
+
+
+
+
+
+
+
+
+
+ The adi.DAQ2.Tx System object is a signal source that can send complex data to the DAQ2.
+
+The class can be instantiated in the following way with and without property name value pairs.
+
+```matlab
+dev = adi.DAQ2.Tx
+dev = adi.DAQ2.Tx(Name, Value)
+```
+
+
Properties
+
+
+
+Unless otherwise indicated, properties are non-tunable, which means you cannot change their values after calling the object. Objects lock when you call them, and the release function unlocks them.
+
+If a property is tunable, you can change its value at any time.
+
Baseband sampling rate in Hz, specified as a scalar in samples per second. This value is constantHelp for adi.DAQ2.Tx.SamplingRate is inherited from superclass ADI.AD9144.TX
+
+
+
+
+
+
Indexs of channels to be enabled. Input should be a [1xN] vector with the indexes of channels to be enabled. Order is irrelevant
+
+
+
+
+
+
Hostname or IP address of remote libIIO deviceHelp for adi.DAQ2.Tx/uri is inherited from superclass MATLABSHARED.LIBIIO.BASE
+
+
+
+
+
+
Number of samples per frame, specified as an even positive integer from 2 to 16,777,216. Using values less than 3660 can yield poor performance.Help for adi.DAQ2.Tx/SamplesPerFrame is inherited from superclass ADI.AD9144.BASE
+
+
+
+
+
+
The number of buffers allocated in the kernel for data transfersHelp for adi.DAQ2.Tx/kernelBuffersCount is inherited from superclass MATLABSHARED.LIBIIO.BASE
+
+
+
+
+
+
A String Representing the data typeHelp for adi.DAQ2.Tx/dataTypeStr is inherited from superclass MATLABSHARED.LIBIIO.BASE
+
+
+
+
+
+
Data source, specified as one of the following: 'DMA' — Specify the host as the source of the data. 'DDS' — Specify the DDS on the radio hardware as the source of the data. In this case, each channel has two additive tones.Help for adi.DAQ2.Tx/DataSource is inherited from superclass ADI.COMMON.DDS
+
+
+
+
+
+
Frequencies values in Hz of the DDS tone generators. For complex data devices the input is a [2xN] matrix where N is the available channels on the board. For complex data devices this is at most max(EnabledChannels)*2. For non-complex data devices this is at most max(EnabledChannels). If N < this upper limit, other DDSs are not set.Help for adi.DAQ2.Tx/DDSFrequencies is inherited from superclass ADI.COMMON.DDS
+
+
+
+
+
+
Scale of DDS tones in range [0,1]. For complex data devices the input is a [2xN] matrix where N is the available channels on the board. For complex data devices this is at most max(EnabledChannels)*2. For non-complex data devices this is at most max(EnabledChannels). If N < this upper limit, other DDSs are not set.Help for adi.DAQ2.Tx/DDSScales is inherited from superclass ADI.COMMON.DDS
+
+
+
+
+
+
Phases of DDS tones in range [0,360000]. For complex data devices the input is a [2xN] matrix where N is the available channels on the board. For complex data devices this is at most max(EnabledChannels)*2. For non-complex data devices this is at most max(EnabledChannels). If N < this upper limit, other DDSs are not set.Help for adi.DAQ2.Tx/DDSPhases is inherited from superclass ADI.COMMON.DDS
+
+
+
+
+
+
Enable Cyclic Buffers, configures transmit buffers to be cyclic, which makes them continuously repeatHelp for adi.DAQ2.Tx/EnableCyclicBuffers is inherited from superclass ADI.COMMON.DDS
+
+
+
+
+
+
Number of samples per frame, specified as an even positive integer from 2 to 16,777,216. Using values less than 3660 can yield poor performance.Help for adi.DAQ2.Tx/SamplesPerFrame is inherited from superclass ADI.AD9144.BASE
+Receive data from Analog Devices AD9361 transceiver
+
+
+
Description
+
+
+The comm.SDRRxPluto System object™ is a signal source that receives data from an Analog Devices® ADALM-PLUTO radio. This connection enables you to simulate and develop various software-defined radio applications.
+
+The following diagram shows the interaction between MATLAB®, the comm.SDRRxPluto System object, and the radio hardware.
+
+
+
+
Creation
+
+Syntax
+
+
+
Properties
+
+
+Unless otherwise indicated, properties are nontunable, which means you cannot change their values after calling the object. Objects lock when you call them, and the release function unlocks them.
+
+If a property is tunable, you can change its value at any time.
+
+For more information on changing property values, see System Design in MATLAB Using System Objects.
+
+
+
+
+
+
+
+
+
+ RF center frequency, specified in Hz as a scalar. The default is 2.4e9. This property is tunable.Help for adi.Pluto.Rx/CenterFrequency is inherited from superclass ADI.AD9361.RX
+
+
+
+
+
+
+
+
+
+
+
+
+ Baseband sampling rate in Hz, specified as a scalar from 65105 to 61.44e6 samples per second.Help for adi.Pluto.Rx/SamplingRate is inherited from superclass ADI.AD9361.RX
+
+
+
+
+
+
+
+
+
+
+
+
+ RF Bandwidth of front-end analog filter in Hz, specified as a scalar from 200 kHz to 56 MHz.Help for adi.Pluto.Rx/RFBandwidth is inherited from superclass ADI.AD9361.RX
+
+
+
+
+
+
+
+
+
+
+
+
+ specified as one of the following: 'slow_attack' — For signals with slowly changing power levels 'fast_attack' — For signals with rapidly changing power levels 'manual' — For setting the gain manually with the Gain property 'hybrid' — For configuring hybrid AGC modeHelp for adi.Pluto.Rx/GainControlModeChannel0 is inherited from superclass ADI.AD9361.RX
+
+
+
+
+
+
+
+
+
+
+
+
+ Channel 0 gain, specified as a scalar from -3 dB to 71 dB. The acceptable minimum and maximum gain setting depends on the center frequency.Help for adi.Pluto.Rx/GainChannel0 is inherited from superclass ADI.AD9361.RX
+
+
+
+
+
+
+
+
+
+
+
+
+ specified as one of the following: 'slow_attack' — For signals with slowly changing power levels 'fast_attack' — For signals with rapidly changing power levels 'manual' — For setting the gain manually with the Gain property 'hybrid' — For configuring hybrid AGC modeHelp for adi.Pluto.Rx/GainControlModeChannel1 is inherited from superclass ADI.AD9361.RX
+
+
+
+
+
+
+
+
+
+
+
+
+ Channel 1 gain, specified as a scalar from -3 dB to 71 dB. The acceptable minimum and maximum gain setting depends on the center frequency.Help for adi.Pluto.Rx/GainChannel1 is inherited from superclass ADI.AD9361.RX
+
+
+
+
+
+
+
+
+
+
+
+
+ Option to set digital loopback mode, specified as 0, 1 or 2. Allows either to digitally loopback TX data into the RX path or vice versa. Value | Mode --------------------------- 0 | Disable 1 | Digital TX -> Digital RX 2 | RF RX -> RF TX Help for adi.Pluto.Rx/LoopbackMode is inherited from superclass ADI.AD9361.RX
+
+
+
+
+
+
+
+
+
+
+
+
+ Option to enable quadrature tracking, specified as true or false. When this property is true, IQ imbalance compensation is applied to the input signal.Help for adi.Pluto.Rx/EnableQuadratureTracking is inherited from superclass ADI.AD9361.RX
+
+
+
+
+
+
+
+
+
+
+
+
+ Option to enable RF DC tracking, specified as true or false. When this property is true, an RF DC blocking filter is applied to the input signal.Help for adi.Pluto.Rx/EnableRFDCTracking is inherited from superclass ADI.AD9361.RX
+
+
+
+
+
+
+
+
+
+
+
+
+ Option to enable baseband DC tracking, specified as true or false. When this property is true, a baseband DC blocking filter is applied to the input signal.Help for adi.Pluto.Rx/EnableBasebandDCTracking is inherited from superclass ADI.AD9361.RX
+
+
+
+
+
+
+
+
+
+
+
+
+ 'A_BALANCED' 'B_BALANCED' 'C_BALANCED' 'A_N' 'A_P' 'B_N' 'B_P' 'C_N' 'C_P' 'TX_MONITOR1' 'TX_MONITOR2' 'TX_MONITOR1_2'Help for adi.Pluto.Rx/RFPortSelect is inherited from superclass ADI.AD9361.RX
+
+
+
+
+
+
+
+
+
+
+
+
+ Number of samples per frame, specified as an even positive integer from 2 to 16,777,216. Using values less than 3660 can yield poor performance.
+
+
+
+
+
+
+
+
+
+
+
+
+ Enable use of custom filter file to set SamplingRate, RFBandwidth, and FIR in datapaths
+
+
+
+
+
+
+
+
+
+
+
+
+ Path to custom filter file created from filter wizard
+
+
+
+
+
+
+
+
+
+
+
+
+ Indexs of channels to be enabled. Input should be a [1xN] vector with the indexes of channels to be enabled. Order is irrelevant
+
+
+
+
+
+
+
+
+
+
+
+
+ Hostname or IP address of remote libIIO deviceHelp for adi.Pluto.Rx/uri is inherited from superclass MATLABSHARED.LIBIIO.BASE
+
+
+
+
+
+
+
+
+
+
+
+
+ If true, connects to libIIO device during simulationHelp for adi.Pluto.Rx/enIO is inherited from superclass MATLABSHARED.LIBIIO.BASE
+
+
+
+
+
+
diff --git a/CI/gen_doc/docs/sysobjs.json b/CI/gen_doc/docs/sysobjs.json
new file mode 100644
index 0000000..7524757
--- /dev/null
+++ b/CI/gen_doc/docs/sysobjs.json
@@ -0,0 +1,178 @@
+[
+ {
+ "name": "adi.AD7380.Rx",
+ "dec": " adi.AD7380.Rx Receives data from the AD7380 ADC The adi.AD7380.Rx System object is a signal source that can receive data from the AD7380.
AD7380 Datasheet Documentation for adi.AD7380.Rx doc adi.AD7380.Rx ",
+ "props": [
+ {
+ "prop_name": "EnabledChannels",
+ "prop_title": " EnabledChannels Enabled Channels",
+ "prop_description": "Indexs of channels to be enabled. Input should be a [1xN] vector with the indexes of channels to be enabled. Order is irrelevant"
+ },
+ {
+ "prop_name": "SampleRate",
+ "prop_title": " SampleRate Sample Rate",
+ "prop_description": "Baseband sampling rate in Hz, specified as a scalar in samples per second. Options are: '256000','128000','64000','32000','16000','8000','4000', '2000','1000'"
+ },
+ {
+ "prop_name": "SamplesPerFrame",
+ "prop_title": " Frame size",
+ "prop_description": "Size of the frame in samplesHelp for adi.AD7380.Rx/SamplesPerFrame is inherited from superclass matlabshared.libiio.base"
+ },
+ {
+ "prop_name": "uri",
+ "prop_title": " URI - remote host URI",
+ "prop_description": "Hostname or IP address of remote libIIO deviceHelp for adi.AD7380.Rx/uri is inherited from superclass matlabshared.libiio.base"
+ }
+ ]
+ },
+ {
+ "name": "adi.AD7768.Rx",
+ "dec": " adi.AD7768.Rx Receives data from the AD7768 ADC The adi.AD7768.Rx System object is a signal source that can receive data from the AD7768.
AD7768 Datasheet Documentation for adi.AD7768.Rx doc adi.AD7768.Rx ",
+ "props": [
+ {
+ "prop_name": "EnabledChannels",
+ "prop_title": " EnabledChannels Enabled Channels",
+ "prop_description": "Indexs of channels to be enabled. Input should be a [1xN] vector with the indexes of channels to be enabled. Order is irrelevant"
+ },
+ {
+ "prop_name": "SampleRate",
+ "prop_title": " SampleRate Sample Rate",
+ "prop_description": "Baseband sampling rate in Hz, specified as a scalar in samples per second. Options are: '256000','128000','64000','32000','16000','8000','4000', '2000','1000'"
+ },
+ {
+ "prop_name": "SamplesPerFrame",
+ "prop_title": " SamplesPerFrame Samples Per Frame",
+ "prop_description": "Number of samples per frame, specified as an even positive integer from 2 to 16,777,216. Using values less than 3660 can yield poor performance."
+ },
+ {
+ "prop_name": "uri",
+ "prop_title": " URI - remote host URI",
+ "prop_description": "Hostname or IP address of remote libIIO deviceHelp for adi.AD7768.Rx/uri is inherited from superclass matlabshared.libiio.base"
+ }
+ ]
+ },
+ {
+ "name": "adi.AD7768_1.Rx",
+ "dec": " adi.AD7768_1.Rx Receives data from the AD7768-1 ADC The adi.AD7768_1.Rx System object is a signal source that can receive data from the AD7768-1.
AD7768-1 Datasheet Documentation for adi.AD7768_1.Rx doc adi.AD7768_1.Rx ",
+ "props": [
+ {
+ "prop_name": "CommonModeVolts",
+ "prop_title": " SCommonModeVolts Common Mode Voltage",
+ "prop_description": "Common mode voltage in volts, specified as a string Options are: '(AVDD1-AVSS)/2','2V5','2V05','1V9','1V65','1V1','0V9','OFF'"
+ },
+ {
+ "prop_name": "EnabledChannels",
+ "prop_title": " EnabledChannels Enabled Channels",
+ "prop_description": "Indexs of channels to be enabled. Input should be a [1xN] vector with the indexes of channels to be enabled. Order is irrelevant"
+ },
+ {
+ "prop_name": "SampleRate",
+ "prop_title": " SampleRate Sample Rate",
+ "prop_description": "Baseband sampling rate in Hz, specified as a scalar in samples per second. Options are: '256000','128000','64000','32000','16000','8000','4000', '2000','1000'"
+ },
+ {
+ "prop_name": "SamplesPerFrame",
+ "prop_title": " SamplesPerFrame Samples Per Frame",
+ "prop_description": "Number of samples per frame, specified as an even positive integer from 2 to 16,777,216. Using values less than 3660 can yield poor performance."
+ },
+ {
+ "prop_name": "uri",
+ "prop_title": " URI - remote host URI",
+ "prop_description": "Hostname or IP address of remote libIIO deviceHelp for adi.AD7768_1.Rx/uri is inherited from superclass matlabshared.libiio.base"
+ }
+ ]
+ },
+ {
+ "name": "adi.AD4030.Rx",
+ "dec": " adi.AD4030.Rx Receives data from the AD4030-24 ADC The adi.AD4030.Rx System object is a signal source that can receive data from the AD4030-24.
AD4030-24 Datasheet Documentation for adi.AD4030.Rx doc adi.AD4030.Rx ",
+ "props": [
+ {
+ "prop_name": "EnabledChannels",
+ "prop_title": " EnabledChannels Enabled Channels",
+ "prop_description": "Indexs of channels to be enabled. Input should be a [1xN] vector with the indexes of channels to be enabled. Order is irrelevant"
+ },
+ {
+ "prop_name": "SampleAveragingLength",
+ "prop_title": " SampleAveragingLength",
+ "prop_description": "Block length of samples to be averaged. Applied in the Averaging Mode register only when OUT_DATA_MD is set to 30-bit averaged differential modeHelp for adi.AD4030.Rx/SampleAveragingLength is inherited from superclass adi.AD463x.Base"
+ },
+ {
+ "prop_name": "SampleRate",
+ "prop_title": " SampleRate Sample Rate",
+ "prop_description": "Baseband sampling rate in Hz, specified as a scalar in samples per second.Help for adi.AD4030.Rx/SampleRate is inherited from superclass adi.AD463x.Base"
+ },
+ {
+ "prop_name": "SamplesPerFrame",
+ "prop_title": " SamplesPerFrame Samples Per Frame",
+ "prop_description": "Number of samples per frame, specified as an even positive integer.Help for adi.AD4030.Rx/SamplesPerFrame is inherited from superclass adi.AD463x.Base"
+ },
+ {
+ "prop_name": "uri",
+ "prop_title": " URI - remote host URI",
+ "prop_description": "Hostname or IP address of remote libIIO deviceHelp for adi.AD4030.Rx/uri is inherited from superclass matlabshared.libiio.base"
+ }
+ ]
+ },
+ {
+ "name": "adi.AD4630_16.Rx",
+ "dec": " adi.AD4630_16.Rx Receive data from the AD4630-16 ADC The adi.AD4630_16.Rx System object is a signal source that can receive data from the AD4630-16.
AD4630-16 Datasheet Documentation for adi.AD4630_16.Rx doc adi.AD4630_16.Rx ",
+ "props": [
+ {
+ "prop_name": "EnabledChannels",
+ "prop_title": " EnabledChannels Enabled Channels",
+ "prop_description": "Indexs of channels to be enabled. Input should be a [1xN] vector with the indexes of channels to be enabled. Order is irrelevant"
+ },
+ {
+ "prop_name": "SampleAveragingLength",
+ "prop_title": " SampleAveragingLength",
+ "prop_description": "Block length of samples to be averaged. Applied in the Averaging Mode register only when OUT_DATA_MD is set to 30-bit averaged differential modeHelp for adi.AD4630_16.Rx/SampleAveragingLength is inherited from superclass adi.AD463x.Base"
+ },
+ {
+ "prop_name": "SampleRate",
+ "prop_title": " SampleRate Sample Rate",
+ "prop_description": "Baseband sampling rate in Hz, specified as a scalar in samples per second.Help for adi.AD4630_16.Rx/SampleRate is inherited from superclass adi.AD463x.Base"
+ },
+ {
+ "prop_name": "SamplesPerFrame",
+ "prop_title": " SamplesPerFrame Samples Per Frame",
+ "prop_description": "Number of samples per frame, specified as an even positive integer.Help for adi.AD4630_16.Rx/SamplesPerFrame is inherited from superclass adi.AD463x.Base"
+ },
+ {
+ "prop_name": "uri",
+ "prop_title": " URI - remote host URI",
+ "prop_description": "Hostname or IP address of remote libIIO deviceHelp for adi.AD4630_16.Rx/uri is inherited from superclass matlabshared.libiio.base"
+ }
+ ]
+ },
+ {
+ "name": "adi.AD4630_24.Rx",
+ "dec": " adi.AD4630_24.Rx Receive data from the AD4630-24 ADC The adi.AD4630_24.Rx System object is a signal source that can receive data from the AD4630-24.