%if EXISTS("_FIXPTLOOK_") == 0
%assign _FIXPTLOOK_ = 1
%include "fixptlook_support.tlc"
%function fxpInterpEvenBigProd(...
yAddrLabel, yDT ,...
yLeftLabel, yRghtLabel, yDataDT,...
xMinusXLeftLabel, xDT,...
spacingLabel, ...
roundMode,satMode) Output
%<FixPt_FloatingPointNotSupported(yDT)>/
%<FixPt_FloatingPointNotSupported(yDataDT)>/
%<FixPt_FloatingPointNotSupported(xDT)>/
%assign yRadixDT = FixPt_CopyDataTypeWithBoolReplace(yDT)
%assign yRadixDT.Bias = 0.0
%assign yRadixDT.FracSlope = 1.0
%assign yDataRadixDT = FixPt_CopyDataTypeWithBoolReplace(yDataDT)
%assign yDataRadixDT.Bias = 0.0
%assign yDataRadixDT.FracSlope = 1.0
%assign xRadixDT = FixPt_CopyDataTypeWithBoolReplace(xDT)
%assign xRadixDT.Bias = 0.0
%assign xRadixDT.FracSlope = 1.0
%assign utilityName = FixPt_UtilityMakeName("INTERPOLATE_EVEN")
%assign utilityName = FixPt_UtilityNameAppendDTPair(utilityName,yRadixDT,yDataRadixDT)
%assign utilityName = FixPt_UtilityNameAppendDT(utilityName,xRadixDT)
%assign utilityName = FixPt_UtilityNameAppendMode(utilityName,roundMode,satMode)
%if SLibInBlockScope()
%assign block = SLibGetCurrentBlock()
%else
%assign block = ""
%endif
%assign utilityName = SLibRegisterSharedUtility(block, utilityName)
%<FcnTrackSharedUtilHeaderFileUsage(utilityName + ".h", TLC_FALSE)>
%<utilityName>( %<yAddrLabel>, %<yLeftLabel>, %<yRghtLabel>, %<xMinusXLeftLabel>, %<spacingLabel>);
%if !(ISFIELD(FixPtUtils,utilityName))
%assign tmpRet = SETFIELD(FixPtUtils,utilityName,1)
%<LibPushEmptyStackSharedUtils()>/
%assign yn = yRadixDT.NativeType
%assign xn = xRadixDT.NativeType
%assign ydn = yDataRadixDT.NativeType
%assign yLocalLabel = "*pY"
%assign yLeftLocalLabel = "yL"
%assign yRghtLocalLabel = "yR"
%assign xLocalLabel = "xMinusxL"
%assign xSpacingLabel = "xSpacing"
%assign xSpacingType = xn
%openfile utilityDef
%assign fcnAbstract = "Lookup Evenly Spaced Interpolation " + utilityName
%assign fcnName = utilityName
%assign fcnReturns = "void"
%assign fcnParams = "%<yn> %<yLocalLabel>, " + ...
"%<ydn> %<yLeftLocalLabel>, " + ...
"%<ydn> %<yRghtLocalLabel>, " + ...
"%<xn> %<xLocalLabel>, " + ...
"%<xSpacingType> %<xSpacingLabel>"
%assign funcDecRoot = fcnReturns + " " + fcnName + "(" + fcnParams + ")"
%openfile funcProto
%<funcDecRoot>;
%closefile funcProto
%selectfile utilityDef
%createrecord fcnRec {Name fcnName; Returns fcnReturns; Params fcnParams; ...
Abstract fcnAbstract; Category "utility"; GeneratedBy "fixptlook.tlc"}
%<SLibDumpFunctionBanner(fcnRec)>
%undef fcnRec
%<funcDecRoot>
{
%assign bigProdBits = yDataRadixDT.RequiredBits + xRadixDT.RequiredBits
%assign isSign = yDataRadixDT.IsSigned || xRadixDT.IsSigned
%if ( bigProdBits <= IntegerSizes.IntNumBits )
%assign freeBits = IntegerSizes.IntNumBits - bigProdBits
%assign bigProdBits = IntegerSizes.IntNumBits
%else
%assign freeBits = IntegerSizes.LongNumBits - bigProdBits
%assign bigProdBits = IntegerSizes.LongNumBits
%endif
%assign fixExp = yDataRadixDT.FixedExp + xRadixDT.FixedExp
%if freeBits > 0
%assign bigProdExtraShift = ...
( yDataDT.FixedExp - yDT.FixedExp )
%if bigProdExtraShift > 0
%if bigProdExtraShift > freeBits
%assign fixExp = fixExp - freeBits
%else
%assign fixExp = fixExp - bigProdExtraShift
%endif
%endif
%endif
%assign dataTypeName = LibFixPointFormDataTypeName(isSign,bigProdBits,fixExp)
%createrecord bigProdDT { ...
DataTypeName dataTypeName; ...
IsSigned isSign; ...
RequiredBits bigProdBits; ...
ActualBits bigProdBits; ...
FixedExp fixExp; ...
FracSlope 1.0; ...
Bias 0.0; ...
NativeType "#error x" ...
}
%<FixPt_DefineDataType(bigProdDT)>/
%assign bigProdLocalLabel = "bigProd"
%assign yDiffLocalLabel = "yDiff"
%assign xDenLocalLabel = "xDen"
%<bigProdDT.NativeType> %<bigProdLocalLabel>;
%<yDataRadixDT.NativeType> %<yDiffLocalLabel>;
%if FixPt_DataTypesSame(yRadixDT,yDataRadixDT)
%assign yAdjustLocalLabel = yDiffLocalLabel
%else
%assign yAdjustLocalLabel = "yAjust"
%<yRadixDT.NativeType> %<yAdjustLocalLabel>;
%endif
%<FixPt_Fix2FixAlwaysOutput(yLocalLabel,yRadixDT,yLeftLocalLabel,yDataRadixDT,roundMode,satMode)>/
%if yRadixDT.IsSigned
%<yDiffLocalLabel> = %<yRghtLocalLabel>;
%<FixPt_AccumNeg(yDiffLocalLabel, yDataRadixDT,yLeftLocalLabel, yDataRadixDT,satMode)>
%<FixPt_Multiply(bigProdLocalLabel, bigProdDT,yDiffLocalLabel, yDataRadixDT,xLocalLabel, xRadixDT,roundMode,satMode)>
%<FixPt_Division(yAdjustLocalLabel, yRadixDT,bigProdLocalLabel, bigProdDT,xSpacingLabel, xRadixDT,roundMode,satMode)>
%<FixPt_AccumPos(yLocalLabel, yRadixDT,yAdjustLocalLabel, yRadixDT,satMode)>
%else
if ( %<yRghtLocalLabel> >= %<yLeftLocalLabel> )
{
%<yDiffLocalLabel> = %<yRghtLocalLabel>;
%<FixPt_AccumNeg(yDiffLocalLabel, yDataRadixDT,yLeftLocalLabel, yDataRadixDT,satMode)>
}
else
{
%<yDiffLocalLabel> = %<yLeftLocalLabel>;
%<FixPt_AccumNeg(yDiffLocalLabel, yDataRadixDT,yRghtLocalLabel, yDataRadixDT,satMode)>
}
%<FixPt_Multiply(bigProdLocalLabel, bigProdDT,yDiffLocalLabel, yDataRadixDT,xLocalLabel, xRadixDT,roundMode,satMode)>
%<FixPt_Division(yAdjustLocalLabel, yRadixDT,bigProdLocalLabel, bigProdDT,xSpacingLabel, xRadixDT,roundMode,satMode)>
if ( %<yRghtLocalLabel> >= %<yLeftLocalLabel> )
{
%<FixPt_AccumPos(yLocalLabel, yRadixDT,yAdjustLocalLabel, yRadixDT,satMode)>
}
else
{
%<FixPt_AccumNeg(yLocalLabel, yRadixDT,yAdjustLocalLabel, yRadixDT,satMode)>
}
%endif
}
%closefile utilityDef
%<SLibAddMathIncludeForUtilsSourceCode(utilityDef)>
%<SLibDumpUtilsSourceCodeAndCacheFunctionPrototype(utilityName,funcProto,utilityDef)>/
%assign GSUStackBuf = LibPopStackSharedUtilsIncludes()
%endif
%endfunction
%function fxpInterpUnevenBigProd(...
yAddrLabel, yDT, ...
yLeftLabel, yRghtLabel, yDataDT, ...
xLabel, xDT, ...
xLeftLabel, xRghtLabel, xDataDT, ...
roundMode,satMode) Output
%<FixPt_FloatingPointNotSupported(yDT)>/
%<FixPt_FloatingPointNotSupported(yDataDT)>/
%<FixPt_FloatingPointNotSupported(xDT)>/
%<FixPt_FloatingPointNotSupported(xDataDT)>/
%assign yRadixDT = FixPt_CopyDataTypeWithBoolReplace(yDT)
%assign yRadixDT.Bias = 0.0
%assign yRadixDT.FracSlope = 1.0
%assign yDataRadixDT = FixPt_CopyDataTypeWithBoolReplace(yDataDT)
%assign yDataRadixDT.Bias = 0.0
%assign yDataRadixDT.FracSlope = 1.0
%assign xRadixDT = FixPt_CopyDataTypeWithBoolReplace(xDT)
%assign xRadixDT.Bias = 0.0
%assign xRadixDT.FracSlope = 1.0
%assign xDataRadixDT = FixPt_CopyDataTypeWithBoolReplace(xDataDT)
%assign xDataRadixDT.Bias = 0.0
%assign xDataRadixDT.FracSlope = 1.0
%assign utilityName = FixPt_UtilityMakeName("INTERPOLATE")
%assign utilityName = FixPt_UtilityNameAppendDTPair(utilityName,yRadixDT,yDataRadixDT)
%assign utilityName = FixPt_UtilityNameAppendDTPair(utilityName,xRadixDT,xDataRadixDT)
%assign utilityName = FixPt_UtilityNameAppendMode(utilityName,roundMode,satMode)
%if SLibInBlockScope()
%assign block = SLibGetCurrentBlock()
%else
%assign block = ""
%endif
%assign utilityName = SLibRegisterSharedUtility(block, utilityName)
%<FcnTrackSharedUtilHeaderFileUsage(utilityName + ".h", TLC_FALSE)>
%<utilityName>( %<yAddrLabel>, %<yLeftLabel>, %<yRghtLabel>, %<xLabel>, %<xLeftLabel>, %<xRghtLabel>);
%if !(ISFIELD(FixPtUtils,utilityName))
%assign tmpRet = SETFIELD(FixPtUtils,utilityName,1)
%<LibPushEmptyStackSharedUtils()>/
%assign yLocalLabel = "*pY"
%assign yLeftLocalLabel = "yL"
%assign yRghtLocalLabel = "yR"
%assign xLocalLabel = "x"
%assign xLeftLocalLabel = "xL"
%assign xRghtLocalLabel = "xR"
%openfile utilityDef
%assign yn = yRadixDT.NativeType
%assign xn = xRadixDT.NativeType
%assign ydn = yDataRadixDT.NativeType
%assign xdn = xDataRadixDT.NativeType
%assign fcnAbstract = "Lookup Interpolation " + utilityName
%assign fcnName = utilityName
%assign fcnReturns = "void"
%assign fcnParams = "%<yn> %<yLocalLabel>, " + ...
"%<ydn> %<yLeftLocalLabel>, " + ...
"%<ydn> %<yRghtLocalLabel>, " + ...
"%<xn> %<xLocalLabel>, " + ...
"%<xdn> %<xLeftLocalLabel>, " + ...
"%<xdn> %<xRghtLocalLabel>"
%assign funcDecRoot = fcnReturns + " " + fcnName + "(" + fcnParams + ")"
%openfile funcProto
%<funcDecRoot>;
%closefile funcProto
%selectfile utilityDef
%createrecord fcnRec {Name fcnName; Returns fcnReturns; Params fcnParams; ...
Abstract fcnAbstract; Category "utility"; GeneratedBy "fixptlook.tlc"}
%<SLibDumpFunctionBanner(fcnRec)>
%undef fcnRec
%<funcDecRoot>
{
%if xRadixDT.RequiredBits > xDataRadixDT.RequiredBits
%assign bigProdBits = yDataRadixDT.RequiredBits + xRadixDT.RequiredBits
%else
%assign bigProdBits = yDataRadixDT.RequiredBits + xDataRadixDT.RequiredBits
%endif
%assign isSign = yDataRadixDT.IsSigned || xRadixDT.IsSigned
%if ( bigProdBits <= IntegerSizes.IntNumBits )
%assign freeBits = IntegerSizes.IntNumBits - bigProdBits
%assign bigProdBits = IntegerSizes.IntNumBits
%else
%assign freeBits = IntegerSizes.LongNumBits - bigProdBits
%assign bigProdBits = IntegerSizes.LongNumBits
%endif
%assign fixExp = yDataRadixDT.FixedExp + xRadixDT.FixedExp
%if freeBits > 0
%assign bigProdExtraShift = ...
( yDataDT.FixedExp - yDT.FixedExp ) - ...
( xDataDT.FixedExp - xDT.FixedExp )
%if bigProdExtraShift > 0
%if bigProdExtraShift > freeBits
%assign fixExp = fixExp - freeBits
%else
%assign fixExp = fixExp - bigProdExtraShift
%endif
%endif
%endif
%assign dataTypeName = LibFixPointFormDataTypeName(isSign,bigProdBits,fixExp)
%createrecord bigProdDT { ...
DataTypeName dataTypeName; ...
IsSigned isSign; ...
RequiredBits bigProdBits; ...
ActualBits bigProdBits; ...
FixedExp fixExp; ...
FracSlope 1.0; ...
Bias 0.0; ...
NativeType "#error x" ...
}
%<FixPt_DefineDataType(bigProdDT)>/
%assign bigProdLocalLabel = "bigProd"
%assign yDiffLocalLabel = "yDiff"
%assign xNumLocalLabel = "xNum"
%assign xDenLocalLabel = "xDen"
%<bigProdDT.NativeType> %<bigProdLocalLabel>;
%<yDataRadixDT.NativeType> %<yDiffLocalLabel>;
%<xRadixDT.NativeType> %<xNumLocalLabel>;
%<xDataRadixDT.NativeType> %<xDenLocalLabel>;
%if FixPt_DataTypesSame(yRadixDT,yDataRadixDT)
%assign yAdjustLocalLabel = yDiffLocalLabel
%else
%assign yAdjustLocalLabel = "yAdjust"
%<yRadixDT.NativeType> %<yAdjustLocalLabel>;
%endif
%if FixPt_DataTypesSame(xRadixDT,xDataRadixDT)
%assign castXLeftLocalLabel = xLeftLocalLabel
%else
%assign castXLeftLocalLabel = "castXLeft"
%<xRadixDT.NativeType> %<castXLeftLocalLabel>;
%<FixPt_Fix2FixAlwaysOutput(castXLeftLocalLabel,xRadixDT,xLeftLocalLabel,xDataRadixDT,roundMode,satMode)>/
%endif
%<FixPt_Fix2FixAlwaysOutput(yLocalLabel,yRadixDT,yLeftLocalLabel,yDataRadixDT,roundMode,satMode)>/
/* If %<xLocalLabel> is not strictly between %<xRghtLocalLabel> and %<xLeftLocalLabel>
* then an interpolation calculation is not necessary %<xLocalLabel> == %<xLeftLocalLabel>
* or not valid. The invalid situation is expected when the input
* is beyond the left or right end of the table. The design is
* that %<yLeftLocalLabel> holds the correct value for %<yLocalLabel>
* in invalid situations.
*/
if ( (%<xRghtLocalLabel> > %<xLeftLocalLabel>) && (%<xLocalLabel> > %<castXLeftLocalLabel>) )
{
%<xDenLocalLabel> = %<xRghtLocalLabel>;
%<FixPt_AccumNeg(xDenLocalLabel, xDataRadixDT,xLeftLocalLabel, xDataRadixDT,satMode)>
%<xNumLocalLabel> = %<xLocalLabel>;
%<FixPt_AccumNeg(xNumLocalLabel, xRadixDT,castXLeftLocalLabel, xRadixDT,satMode)>
%if yRadixDT.IsSigned
%<yDiffLocalLabel> = %<yRghtLocalLabel>;
%<FixPt_AccumNeg(yDiffLocalLabel, yDataRadixDT,yLeftLocalLabel, yDataRadixDT,satMode)>
%<FixPt_Multiply(bigProdLocalLabel, bigProdDT,yDiffLocalLabel, yDataRadixDT,xNumLocalLabel, xRadixDT,roundMode,satMode)>
%<FixPt_Division(yAdjustLocalLabel, yRadixDT,bigProdLocalLabel, bigProdDT,xDenLocalLabel, xDataRadixDT,roundMode,satMode)>
%<FixPt_AccumPos(yLocalLabel, yRadixDT,yAdjustLocalLabel, yRadixDT,satMode)>
%else
if ( %<yRghtLocalLabel> >= %<yLeftLocalLabel> )
{
%<yDiffLocalLabel> = %<yRghtLocalLabel>;
%<FixPt_AccumNeg(yDiffLocalLabel, yDataRadixDT,yLeftLocalLabel, yDataRadixDT,satMode)>
}
else
{
%<yDiffLocalLabel> = %<yLeftLocalLabel>;
%<FixPt_AccumNeg(yDiffLocalLabel, yDataRadixDT,yRghtLocalLabel, yDataRadixDT,satMode)>
}
%<FixPt_Multiply(bigProdLocalLabel, bigProdDT,yDiffLocalLabel, yDataRadixDT,xNumLocalLabel, xRadixDT,roundMode,satMode)>
%<FixPt_Division(yAdjustLocalLabel, yRadixDT,bigProdLocalLabel, bigProdDT,xDenLocalLabel, xDataRadixDT,roundMode,satMode)>
if ( %<yRghtLocalLabel> >= %<yLeftLocalLabel> )
{
%<FixPt_AccumPos(yLocalLabel, yRadixDT,yAdjustLocalLabel, yRadixDT,satMode)>
}
else
{
%<FixPt_AccumNeg(yLocalLabel, yRadixDT,yAdjustLocalLabel, yRadixDT,satMode)>
}
%endif
}
}
%closefile utilityDef
%<SLibDumpUtilsSourceCodeAndCacheFunctionPrototype(utilityName,funcProto,utilityDef)>/
%assign GSUStackBuf = LibPopStackSharedUtilsIncludes()
%endif
%endfunction
%function fxpInterpolateGetLambdaDT( ...
yDT, yDataDT, xDT, xDataDT, ...
spacingIsPow2, spacingPow2Exp, ...
allowPow2Optimization ) void
%if FixPt_DataTypeIsFloat(yDT) || ...
FixPt_DataTypeIsFloat(yDataDT) || ...
FixPt_DataTypeIsFloat(xDT) || ...
FixPt_DataTypeIsFloat(xDataDT)
%assign doFloat = 1
%if !FixPt_DataTypeIsSingle(yDT) || ...
!FixPt_DataTypeIsSingle(yDataDT) || ...
!FixPt_DataTypeIsSingle(xDT) || ...
!FixPt_DataTypeIsSingle(xDataDT)
%assign lambdaDT = FixPt_GetDataTypeFromIndex(0)
%else
%assign lambdaDT = FixPt_GetDataTypeFromIndex(1)
%endif
%else
%if yDT.RequiredBits > yDataDT.RequiredBits
%assign maxOutReqBits = yDT.RequiredBits
%assign maxOutActBits = yDT.ActualBits
%else
%assign maxOutReqBits = yDataDT.RequiredBits
%assign maxOutActBits = yDataDT.ActualBits
%endif
%if xDT.RequiredBits > xDataDT.RequiredBits
%assign maxInReqBits = xDT.RequiredBits
%assign maxInActBits = xDT.ActualBits
%else
%assign maxInReqBits = xDataDT.RequiredBits
%assign maxInActBits = xDataDT.ActualBits
%endif
%if maxInReqBits > maxOutReqBits
%assign lambdaReqBits = maxInReqBits
%assign lambdaActBits = maxInActBits
%else
%assign lambdaReqBits = maxOutReqBits
%assign lambdaActBits = maxOutActBits
%endif
%assign isSigned = 0
%if allowPow2Optimization && spacingIsPow2
%assign fixedExp = -1*spacingPow2Exp
%else
%assign fixedExp = (1+isSigned-lambdaReqBits)
%endif
%assign dataTypeName = LibFixPointFormDataTypeName(isSigned,lambdaReqBits,fixedExp)
%createrecord lambdaDT { ...
DataTypeName dataTypeName; ...
IsSigned isSigned; ...
RequiredBits lambdaReqBits; ...
ActualBits lambdaActBits; ...
FixedExp fixedExp; ...
FracSlope 1.0; ...
Bias 0.0; ...
NativeType "#error x" ...
}
%<FixPt_DefineDataType(lambdaDT)>/
%endif
%return lambdaDT
%endfunction
%function fxpInterpolateGetLambdaDTUneven( ...
yDT, yDataDT, xDT, xDataDT, ...
allowPow2Optimization ) void
%assign mootBreakPointInfo = FixPt_BreakPointInfoDefault()
%assign lambdaDT = fxpInterpolateGetLambdaDT( ...
yDT, yDataDT, xDT, xDataDT, ...
mootBreakPointInfo.spacingIsPow2, ...
mootBreakPointInfo.spacingPow2Exp, ...
allowPow2Optimization )
%return lambdaDT
%endfunction
%function fxpInterpolateCalcLambdaPow2( ...
uAdjLabel, u0DT,...
lambdaLabel, lambdaDT,...
pow2ExpValue, ...
roundMode, satMode) Output
%assert !FixPt_DataTypeIsFloat(lambdaDT)
%assert pow2ExpValue == -lambdaDT.FixedExp
/* The table is inlined with even spacing 2^%<pow2ExpValue>, so
* the interpolation factor is the least significant %<pow2ExpValue> bits. */
%assign mask = SetLSNBitsStr(pow2ExpValue,u0DT.ActualBits,0)
%<lambdaLabel> = %<uAdjLabel> & %<mask>;
%endfunction
%function fxpInterpolateCalcLambdaEven( ...
uAdjLabel, u0DT,...
lambdaLabel, lambdaDT,...
spacingValue, ...
iLeftLabel,...
roundMode, satMode) Output
%assign deltaDT = FixPt_CopyDataTypeWithBoolReplace(u0DT)
%assign deltaDT.Bias = 0.0
%assign numLabel = "num"
%assign unsignType = utilFloatOrUnsignedTypeFromDT(u0DT)
{
%<u0DT.NativeType> %<numLabel> = (%<unsignType>)%<uAdjLabel> - ( %<iLeftLabel> * %<spacingValue> );
%assign denLabel = STRING(spacingValue)
%<FixPt_Division(lambdaLabel,lambdaDT,numLabel,deltaDT,denLabel,deltaDT,roundMode,satMode)>/
}
%endfunction
%function fxpInterpolateCalcLambdaEven2( ...
uMinusLeftLabel, u0DT,...
lambdaLabel, lambdaDT,...
spacingValue, ...
roundMode, satMode) Output
%assign deltaDT = FixPt_CopyDataTypeWithBoolReplace(u0DT)
%assign deltaDT.Bias = 0.0
%<FixPt_Division(...
lambdaLabel, lambdaDT, ...
uMinusLeftLabel, deltaDT, ...
STRING(spacingValue), deltaDT, ...
roundMode,satMode)>/
%endfunction
%function fxpInterpolateGetNumDataType( ...
u0DT, ...
u0DataDT, ...
lambdaDT) Output
%if FixPt_DataTypeIsFloat">FixPt_DataTypeIsFloat(u0DT) || FixPt_DataTypeIsFloat">FixPt_DataTypeIsFloat(u0DataDT)
%return lambdaDT
%else
%return u0DT
%endif
%endfunction
%function fxpInterpolateGetDenDataType( ...
u0DT, ...
u0DataDT, ...
lambdaDT) Output
%if FixPt_DataTypeIsFloat">FixPt_DataTypeIsFloat(u0DT) || FixPt_DataTypeIsFloat">FixPt_DataTypeIsFloat(u0DataDT)
%return lambdaDT
%else
%return u0DataDT
%endif
%endfunction
%function fxpInterpolateCalcLambdaUneven( ...
u0Label, u0DT,...
lambdaLabel, lambdaDT,...
u0LeftLabel, u0RghtLabel, u0DataDT, ...
roundMode,satMode) Output
%<FixPt_CheckInputBreakpointDataTypes(u0DT,u0DataDT)>/
if ( %<u0RghtLabel> > %<u0LeftLabel> )
{
%assign numDT = fxpInterpolateGetNumDataType(u0DT, u0DataDT, lambdaDT)
%assign denDT = fxpInterpolateGetDenDataType(u0DT, u0DataDT, lambdaDT)
%assign deltaDT = FixPt_CopyDataTypeWithBoolReplace(numDT)
%assign deltaDT.Bias = 0.0
%assign numLabel = "num"
%assign denLabel = "den"
%if FixPt_DataTypesSame(numDT,denDT)
%assign deltaDenDT = deltaDT
%else
%assign deltaDenDT = FixPt_CopyDataTypeWithBoolReplace(denDT)
%assign deltaDenDT.Bias = 0.0
%endif
%<numDT.NativeType> %<numLabel>;
%<denDT.NativeType> %<denLabel>;
%<denLabel> = %<u0RghtLabel>;
%<FixPt_AccumNeg(denLabel,deltaDenDT,u0LeftLabel,deltaDenDT,satMode)>/
%if FixPt_DataTypeIsFloat">FixPt_DataTypeIsFloat(u0DataDT) && !FixPt_DataTypeIsFloat">FixPt_DataTypeIsFloat(u0DT)
/* cast current input to the data type/scaling of the breakpoint data */
%<FixPt_Fix2FixAlwaysOutput(numLabel,u0DataDT,u0Label,u0DT,"Floor","Saturate")>
%else
%<numLabel> = %<u0Label>;
%endif
%if FixPt_DataTypesSame(deltaDT,deltaDenDT)
%<FixPt_AccumNeg(numLabel,deltaDT,u0LeftLabel,deltaDenDT,satMode)>/
%else
%assign tempVarName = "tempConversion"
%openfile captureConvert
%assign retVecStr = FixPt_Fix2Fix(tempVarName,deltaDT,u0LeftLabel,deltaDenDT,roundMode,satMode)
%closefile captureConvert
%if SIZE(retVecStr,1) == 3
%<FixPt_AccumNeg(numLabel,deltaDT,retVecStr[1],deltaDT,satMode)>/
%else
{
%<deltaDT.NativeType> %<tempVarName>;
%<captureConvert>/
%<FixPt_AccumNeg(numLabel,deltaDT,tempVarName,deltaDT,satMode)>/
}
%endif
%endif
%<FixPt_Division(lambdaLabel,lambdaDT,numLabel,deltaDT,denLabel,deltaDenDT,roundMode,satMode)>/
}
else
{
%<lambdaLabel> = %<FixPt_GetGroundValueOrNameFromDataTypeRec(lambdaDT, TLC_FALSE)>;
}
%endfunction
%function fxpInterpolateApplyLambda(...
yLabel, yDT,...
yLeftLabel, yRghtLabel, yDataDT,...
lambdaLabel,lambdaDT,...
roundMode,satMode) Output
%assign yRadixDT = FixPt_CopyDataTypeWithBoolReplace(yDT)
%assign yRadixDT.Bias = 0.0
%assign yRadixDT.FracSlope = 1.0
%assign yDataRadixDT = FixPt_CopyDataTypeWithBoolReplace(yDataDT)
%assign yDataRadixDT.Bias = 0.0
%assign yDataRadixDT.FracSlope = 1.0
%if FixPt_DataTypeIsFloat(lambdaDT)
{
%assign tempLabela = "yLeftCast"
%assign tempLabelb = "yRghtCast"
%<lambdaDT.NativeType> %<tempLabela>;
%<lambdaDT.NativeType> %<tempLabelb>;
%<FixPt_Fix2FixAlwaysOutput(tempLabela,lambdaDT,yLeftLabel,yDataRadixDT,roundMode,satMode)>/
%<FixPt_Fix2FixAlwaysOutput(tempLabelb,lambdaDT,yRghtLabel,yDataRadixDT,roundMode,satMode)>/
%<tempLabela> += %<lambdaLabel> * ( %<tempLabelb> - %<tempLabela> );
%<FixPt_Fix2FixAlwaysOutput(yLabel,yRadixDT,tempLabela,lambdaDT,roundMode,satMode)>/
}
%elseif FixPt_DataTypeIsFloat(yRadixDT) || (yRadixDT.IsSigned && yDataRadixDT.IsSigned)
%if FixPt_DataTypesSame(yRadixDT,yDataRadixDT) && yLabel != yLeftLabel
%if yLabel != yRghtLabel
%<yLabel> = %<yRghtLabel>;
%endif
%<FixPt_AccumNeg(yLabel,yRadixDT,yLeftLabel,yRadixDT,satMode)>/
%<FixPt_Multiply(yLabel,yRadixDT,lambdaLabel,lambdaDT,yLabel,yRadixDT,roundMode,satMode)>/
%<FixPt_AccumPos(yLabel,yRadixDT,yLeftLabel,yRadixDT,satMode)>/
%else
%assign tempDiffVarName = "tempDiff"
%assign tempConvertVarName = "tempConversion"
%openfile captureConvert
%assign retVecStr = FixPt_Fix2Fix(tempConvertVarName,yRadixDT,yLeftLabel,yDataRadixDT,roundMode,satMode)
%if SIZE(retVecStr,1) != 3 || yLabel == yLeftLabel
%assign needTempConvertVar = 1
%else
%assign needTempConvertVar = 0
%endif
%closefile captureConvert
{
%<yDataRadixDT.NativeType> %<tempDiffVarName>;
%if needTempConvertVar
%<yRadixDT.NativeType> %<tempConvertVarName>;
%endif
%if needTempConvertVar
%<captureConvert>/
%if SIZE(retVecStr,1) == 3
%
%endif
%endif
%<tempDiffVarName> = %<yRghtLabel>;
%<FixPt_AccumNeg(tempDiffVarName,yDataRadixDT,yLeftLabel,yDataRadixDT,satMode)>/
%<FixPt_Multiply(yLabel,yRadixDT,lambdaLabel,lambdaDT,tempDiffVarName,yDataRadixDT,roundMode,satMode)>/
%if needTempConvertVar
%<FixPt_AccumPos(yLabel,yRadixDT,tempConvertVarName,yRadixDT,satMode)>/
%else
%<FixPt_AccumPos(yLabel,yRadixDT,retVecStr[1],yRadixDT,satMode)>/
%endif
}
%endif
%else
{
%assign yTempLabel2 = "yTemp2"
%assign absDiffLabel = "absDiff"
%<yRadixDT.NativeType> %<yTempLabel2>;
%<yDataRadixDT.NativeType> %<absDiffLabel>;
%if yLabel != yLeftLabel
%<FixPt_Fix2FixAlwaysOutput(yLabel,yRadixDT,yLeftLabel,yDataRadixDT,roundMode,satMode)>/
%endif
if ( %<yRghtLabel> >= %<yLeftLabel> )
{
%<absDiffLabel> = %<yRghtLabel>;
%<FixPt_AccumNeg(absDiffLabel,yDataRadixDT,yLeftLabel,yDataRadixDT,satMode)>/
%<FixPt_Multiply(yTempLabel2,yRadixDT,lambdaLabel,lambdaDT,absDiffLabel,yDataRadixDT,roundMode,satMode)>/
%<FixPt_AccumPos(yLabel,yRadixDT,yTempLabel2,yRadixDT,satMode)>/
}
else
{
%<absDiffLabel> = %<yLeftLabel>;
%<FixPt_AccumNeg(absDiffLabel,yDataRadixDT,yRghtLabel,yDataRadixDT,satMode)>/
%<FixPt_Multiply(yTempLabel2,yRadixDT,lambdaLabel,lambdaDT,absDiffLabel,yDataRadixDT,roundMode,satMode)>/
%<FixPt_AccumNeg(yLabel,yRadixDT,yTempLabel2,yRadixDT,satMode)>/
}
}
%endif
%endfunction
%function utilDecideSearchMethod(xDT,xDataDT,xDataBreakPointInfo)
%<FixPt_CheckInputBreakpointDataTypes(xDT,xDataDT)>/
%if !FixPt_DataTypeIsFloat(xDT) && ...
!FixPt_DataTypeIsFloat(xDataDT) && ...
ISEQUAL(xDataBreakPointInfo.spacingValue,1) && ...
(xDT.FixedExp == xDataDT.FixedExp)
%assign searchMethod = searchTrivial
%else
%if xDataBreakPointInfo.evenlySpaced
%if !FixPt_DataTypeIsFloat(xDT) && ...
!FixPt_DataTypeIsFloat(xDataDT) && ...
xDataBreakPointInfo.spacingIsPow2
%assign searchMethod = searchPow2
%else
%assign searchMethod = searchEven
%endif
%else
%assign searchMethod = searchUneven
%endif
%endif
%return searchMethod
%endfunction
%function utilDecideInterpolateMethod(...
yDT,yDataDT,xDT,xDataDT,...
evenlySpaced,...
spacingValue,...
spacingIsPow2)
%<FixPt_CheckInputBreakpointDataTypes(xDT,xDataDT)>/
%if !FixPt_DataTypeIsFloat(xDT) && ...
!FixPt_DataTypeIsFloat(xDataDT) && ...
ISEQUAL(spacingValue,1) && ...
(xDT.FixedExp == xDataDT.FixedExp)
%assign interpolateMethod = interpolateTrivial
%elseif FixPt_DataTypeIsFloat(yDT) || ...
FixPt_DataTypeIsFloat(xDT) || ...
FixPt_DataTypeIsFloat(yDataDT) || ...
FixPt_DataTypeIsFloat(xDataDT)
%assign interpolateMethod = interpolateLambda
%else
%if evenlySpaced && spacingIsPow2
%assign interpolateMethod = interpolatePow2
%else
%if xDT.RequiredBits > xDataDT.RequiredBits
%assign maxInReqBits = xDT.RequiredBits
%else
%assign maxInReqBits = xDataDT.RequiredBits
%endif
%assign bigProdBits = yDataDT.RequiredBits + maxInReqBits
%assign bigProdWithExtraShift = bigProdBits + ...
( yDataDT.FixedExp - yDT.FixedExp ) - ...
( xDataDT.FixedExp - xDT.FixedExp )
%if ( bigProdBits <= IntegerSizes.LongNumBits ) && ...
( bigProdBits <= 32 ) && ...
( bigProdWithExtraShift <= IntegerSizes.LongNumBits ) && ...
( bigProdWithExtraShift <= 32 )
%assign interpolateMethod = interpolateBigProduct
%else
%assign interpolateMethod = interpolateLambda
%endif
%endif
%endif
%return interpolateMethod
%endfunction
%function utilDecideInterpolateMethodUneven(yDT,yDataDT,xDT,xDataDT)
%assign mootBreakPointInfo = FixPt_BreakPointInfoDefault()
%assign interpolateMethod = utilDecideInterpolateMethod(...
yDT,yDataDT,xDT,xDataDT,...
mootBreakPointInfo.evenlySpaced,...
mootBreakPointInfo.spacingValue,...
mootBreakPointInfo.spacingIsPow2)
%return interpolateMethod
%endfunction
%endif