Skip to content

Commit

Permalink
Refactored data model for filters starting with M. See #650.
Browse files Browse the repository at this point in the history
  • Loading branch information
azonenberg committed Aug 28, 2022
1 parent 629aa9f commit 10bd5c7
Show file tree
Hide file tree
Showing 6 changed files with 156 additions and 68 deletions.
12 changes: 8 additions & 4 deletions scopeprotocols/MDIODecoder.cpp
Expand Up @@ -91,8 +91,10 @@ void MDIODecoder::Refresh()
}

//Get the input data
auto mdio = GetDigitalInputWaveform(0);
auto mdc = GetDigitalInputWaveform(1);
auto mdio = GetInputWaveform(0);
auto mdc = GetInputWaveform(1);
mdio->PrepareForCpuAccess();
mdc->PrepareForCpuAccess();

int phytype = m_parameters[m_typename].GetIntVal();

Expand All @@ -101,14 +103,15 @@ void MDIODecoder::Refresh()
cap->m_timescale = 1; //SampleOnRisingEdges() gives us fs level timestamps
cap->m_startTimestamp = mdc->m_startTimestamp;
cap->m_startFemtoseconds = mdc->m_startFemtoseconds;
cap->PrepareForCpuAccess();

//Maintain MMD state across transactions
int mmd_dev = 0;
bool mmd_is_reg = false;

//Sample the data stream at each clock edge
DigitalWaveform dmdio;
SampleOnRisingEdges(mdio, mdc, dmdio);
SparseDigitalWaveform dmdio;
SampleOnRisingEdgesBase(mdio, mdc, dmdio);
size_t dlen = dmdio.m_samples.size();
for(size_t i=0; i<dlen; i++)
{
Expand Down Expand Up @@ -605,6 +608,7 @@ void MDIODecoder::Refresh()
}

SetData(cap, 0);
cap->MarkModifiedFromCpu();
}

vector<string> MDIODecoder::GetHeaders()
Expand Down
60 changes: 40 additions & 20 deletions scopeprotocols/MagnitudeFilter.cpp
Expand Up @@ -71,35 +71,55 @@ string MagnitudeFilter::GetProtocolName()
void MagnitudeFilter::Refresh()
{
//Make sure we've got valid inputs
if(!VerifyAllInputsOKAndAnalog())
if(!VerifyAllInputsOK())
{
SetData(NULL, 0);
return;
}

//Get the input data
auto a = GetAnalogInputWaveform(0);
auto b = GetAnalogInputWaveform(1);
auto len = min(a->m_samples.size(), b->m_samples.size());
auto a = GetInputWaveform(0);
auto b = GetInputWaveform(1);
a->PrepareForCpuAccess();
b->PrepareForCpuAccess();
auto len = min(a->size(), b->size());

//Copy Y axis units from input
SetYAxisUnits(m_inputs[0].GetYAxisUnits(), 0);

//Set up the output waveform
auto cap = new AnalogWaveform;
cap->Resize(len);
cap->CopyTimestamps(a);
auto ua = dynamic_cast<UniformAnalogWaveform*>(a);
auto ub = dynamic_cast<UniformAnalogWaveform*>(b);
auto sa = dynamic_cast<SparseAnalogWaveform*>(a);
auto sb = dynamic_cast<SparseAnalogWaveform*>(b);

float* fa = (float*)__builtin_assume_aligned(&a->m_samples[0], 16);
float* fb = (float*)__builtin_assume_aligned(&b->m_samples[0], 16);
float* fdst = (float*)__builtin_assume_aligned(&cap->m_samples[0], 16);
for(size_t i=0; i<len; i++)
fdst[i] = sqrtf(fa[i]*fa[i] + fb[i]*fb[i]);

//Copy our time scales from the input
cap->m_timescale = a->m_timescale;
cap->m_startTimestamp = a->m_startTimestamp;
cap->m_startFemtoseconds = a->m_startFemtoseconds;

SetData(cap, 0);
if(ua && ub)
{
//Set up the output waveform
auto cap = SetupEmptyUniformAnalogOutputWaveform(a, 0);
cap->Resize(len);
cap->PrepareForCpuAccess();

float* fa = (float*)__builtin_assume_aligned(ua->m_samples.GetCpuPointer(), 16);
float* fb = (float*)__builtin_assume_aligned(ub->m_samples.GetCpuPointer(), 16);
float* fdst = (float*)__builtin_assume_aligned(cap->m_samples.GetCpuPointer(), 16);
for(size_t i=0; i<len; i++)
fdst[i] = sqrtf(fa[i]*fa[i] + fb[i]*fb[i]);

cap->MarkModifiedFromCpu();
}
else if(sa && sb)
{
//Set up the output waveform
auto cap = SetupSparseOutputWaveform(sa, 0, 0, 0);
cap->Resize(len);
cap->PrepareForCpuAccess();

float* fa = (float*)__builtin_assume_aligned(sa->m_samples.GetCpuPointer(), 16);
float* fb = (float*)__builtin_assume_aligned(sb->m_samples.GetCpuPointer(), 16);
float* fdst = (float*)__builtin_assume_aligned(cap->m_samples.GetCpuPointer(), 16);
for(size_t i=0; i<len; i++)
fdst[i] = sqrtf(fa[i]*fa[i] + fb[i]*fb[i]);

cap->MarkModifiedFromCpu();
}
}
19 changes: 13 additions & 6 deletions scopeprotocols/MilStd1553Decoder.cpp
Expand Up @@ -84,14 +84,18 @@ void MilStd1553Decoder::Refresh()
ClearPackets();

//Get the input data
if(!VerifyAllInputsOKAndAnalog())
if(!VerifyAllInputsOK())
{
SetData(NULL, 0);
return;
}

auto din = GetAnalogInputWaveform(0);
size_t len = din->m_samples.size();
auto din = GetInputWaveform(0);
din->PrepareForCpuAccess();
size_t len = din->size();

auto sdin = dynamic_cast<SparseAnalogWaveform*>(din);
auto udin = dynamic_cast<UniformAnalogWaveform*>(din);

//Copy our time scales from the input
auto cap = new MilStd1553Waveform;
Expand All @@ -100,6 +104,7 @@ void MilStd1553Decoder::Refresh()
cap->m_startFemtoseconds = din->m_startFemtoseconds;
cap->m_triggerPhase = din->m_triggerPhase;
SetData(cap, 0);
cap->PrepareForCpuAccess();

enum
{
Expand Down Expand Up @@ -151,18 +156,18 @@ void MilStd1553Decoder::Refresh()
Packet* pack = NULL;
for(size_t i=0; i<len; i++)
{
int64_t timestamp = din->m_offsets[i];
int64_t timestamp = ::GetOffset(sdin, udin, i);
int64_t duration = timestamp - tbitstart;

//Determine the current line state
bool current_bit = last_bit;
bool valid = false;
if(din->m_samples[i] > high)
if(GetValue(sdin, udin, i) > high)
{
current_bit = true;
valid = true;
}
else if(din->m_samples[i] < low)
else if(GetValue(sdin, udin, i) < low)
{
current_bit = false;
valid = true;
Expand Down Expand Up @@ -671,6 +676,8 @@ void MilStd1553Decoder::Refresh()

last_bit = current_bit;
}

cap->MarkModifiedFromCpu();
}

Gdk::Color MilStd1553Waveform::GetColor(size_t i)
Expand Down
72 changes: 49 additions & 23 deletions scopeprotocols/MovingAverageFilter.cpp
Expand Up @@ -72,15 +72,16 @@ string MovingAverageFilter::GetProtocolName()

void MovingAverageFilter::Refresh()
{
if(!VerifyAllInputsOKAndAnalog())
if(!VerifyAllInputsOK())
{
SetData(NULL, 0);
return;
}

//Get the input data
auto din = GetAnalogInputWaveform(0);
size_t len = din->m_samples.size();
auto din = GetInputWaveform(0);
din->PrepareForCpuAccess();
size_t len = din->size();
size_t depth = m_parameters[m_depthname].GetIntVal();
if(len < depth)
{
Expand All @@ -91,27 +92,52 @@ void MovingAverageFilter::Refresh()
m_xAxisUnit = m_inputs[0].m_channel->GetXAxisUnits();
SetYAxisUnits(m_inputs[0].GetYAxisUnits(), 0);

//Do the average
auto cap = new AnalogWaveform;
size_t nsamples = len - depth;
size_t off = depth/2;
cap->Resize(nsamples);
//#pragma omp parallel for
for(size_t i=0; i<nsamples; i++)
size_t nsamples = len - 2*off;

auto sdin = dynamic_cast<SparseAnalogWaveform*>(din);
auto udin = dynamic_cast<UniformAnalogWaveform*>(din);

if(sdin)
{
float v = 0;
for(size_t j=0; j<depth; j++)
v += din->m_samples[i+j];
v /= depth;

cap->m_offsets[i] = din->m_offsets[i+off];
cap->m_durations[i] = din->m_durations[i+off];
cap->m_samples[i] = v;
//Do the average
auto cap = SetupSparseOutputWaveform(sdin, 0, off, off);
cap->PrepareForCpuAccess();

//#pragma omp parallel for
for(size_t i=0; i<nsamples; i++)
{
float v = 0;
for(size_t j=0; j<depth; j++)
v += sdin->m_samples[i+j];
v /= depth;

cap->m_offsets[i] = sdin->m_offsets[i+off];
cap->m_durations[i] = sdin->m_durations[i+off];
cap->m_samples[i] = v;
}
SetData(cap, 0);

cap->MarkModifiedFromCpu();
}
else
{
//Do the average
auto cap = SetupEmptyUniformAnalogOutputWaveform(udin, 0);
cap->PrepareForCpuAccess();
cap->Resize(nsamples);
//#pragma omp parallel for
for(size_t i=0; i<nsamples; i++)
{
float v = 0;
for(size_t j=0; j<depth; j++)
v += udin->m_samples[i+j];
v /= depth;

cap->m_samples[i] = v;
}
SetData(cap, 0);

cap->MarkModifiedFromCpu();
}
SetData(cap, 0);

//Copy our time scales from the input
cap->m_timescale = din->m_timescale;
cap->m_startTimestamp = din->m_startTimestamp;
cap->m_startFemtoseconds = din->m_startFemtoseconds;
}
4 changes: 4 additions & 0 deletions scopeprotocols/MultimeterTrendFilter.cpp
Expand Up @@ -130,6 +130,8 @@ void MultimeterTrendFilter::OnDataReady(double prival, double secval)

void MultimeterTrendFilter::AddSample(SparseAnalogWaveform* wfm, double value, double now)
{
wfm->PrepareForCpuAccess();

//Remove old samples
size_t nmax = 4096;
while(wfm->m_samples.size() > nmax)
Expand Down Expand Up @@ -161,4 +163,6 @@ void MultimeterTrendFilter::AddSample(SparseAnalogWaveform* wfm, double value, d
len = wfm->m_samples.size();
for(size_t i=0; i<len; i++)
wfm->m_offsets[i] -= dt;

wfm->MarkModifiedFromCpu();
}
57 changes: 42 additions & 15 deletions scopeprotocols/MultiplyFilter.cpp
Expand Up @@ -71,29 +71,56 @@ string MultiplyFilter::GetProtocolName()
void MultiplyFilter::Refresh()
{
//Make sure we've got valid inputs
if(!VerifyAllInputsOKAndAnalog())
if(!VerifyAllInputsOK())
{
SetData(NULL, 0);
return;
}

//Get the input data
auto a = GetAnalogInputWaveform(0);
auto b = GetAnalogInputWaveform(1);
auto len = min(a->m_samples.size(), b->m_samples.size());
auto a = GetInputWaveform(0);
auto b = GetInputWaveform(1);
auto len = min(a->size(), b->size());
a->PrepareForCpuAccess();
b->PrepareForCpuAccess();

//Multiply the units
SetYAxisUnits(m_inputs[0].GetYAxisUnits() * m_inputs[1].GetYAxisUnits(), 0);

//Set up the output waveform
auto cap = SetupOutputWaveform(a, 0, 0, 0);
cap->m_samples.resize(len);
cap->m_offsets.resize(len);
cap->m_durations.resize(len);

float* fa = (float*)__builtin_assume_aligned(&a->m_samples[0], 16);
float* fb = (float*)__builtin_assume_aligned(&b->m_samples[0], 16);
float* fdst = (float*)__builtin_assume_aligned(&cap->m_samples[0], 16);
for(size_t i=0; i<len; i++)
fdst[i] = fa[i] * fb[i];
//Type conversion
auto sa = dynamic_cast<SparseAnalogWaveform*>(a);
auto sb = dynamic_cast<SparseAnalogWaveform*>(b);
auto ua = dynamic_cast<UniformAnalogWaveform*>(a);
auto ub = dynamic_cast<UniformAnalogWaveform*>(b);

if(sa && sb)
{
//Set up the output waveform
auto cap = SetupSparseOutputWaveform(sa, 0, 0, 0);
cap->Resize(len);
cap->PrepareForCpuAccess();

float* fa = (float*)__builtin_assume_aligned(sa->m_samples.GetCpuPointer(), 16);
float* fb = (float*)__builtin_assume_aligned(sb->m_samples.GetCpuPointer(), 16);
float* fdst = (float*)__builtin_assume_aligned(cap->m_samples.GetCpuPointer(), 16);
for(size_t i=0; i<len; i++)
fdst[i] = fa[i] * fb[i];

cap->MarkModifiedFromCpu();
}
else if(ua && ub)
{
//Set up the output waveform
auto cap = SetupEmptyUniformAnalogOutputWaveform(sa, 0);
cap->Resize(len);
cap->PrepareForCpuAccess();

float* fa = (float*)__builtin_assume_aligned(ua->m_samples.GetCpuPointer(), 16);
float* fb = (float*)__builtin_assume_aligned(ub->m_samples.GetCpuPointer(), 16);
float* fdst = (float*)__builtin_assume_aligned(cap->m_samples.GetCpuPointer(), 16);
for(size_t i=0; i<len; i++)
fdst[i] = fa[i] * fb[i];

cap->MarkModifiedFromCpu();
}
}

0 comments on commit 10bd5c7

Please sign in to comment.