%if EXISTS("_DSPFIXPTLIB_") == 0
%assign _DSPFIXPTLIB_ = 1
%function DSPFixptLibEquals(Out, Inp, RndSat) Output
%if ((Out.label != Inp.label) || (Out.isComplex != Inp.isComplex) || (Out.dTypeRec != Inp.dTypeRec))
%if (Out.isComplex)
%assign OutReLabel = Out.label + ".re"
%assign OutImLabel = Out.label + ".im"
%if (Inp.isComplex)
%assign InpReLabel = Inp.label + ".re"
%assign InpImLabel = Inp.label + ".im"
/* %<Out.label> = %<Inp.label> */
%<FixPt_Fix2FixAlwaysOutput(OutReLabel, Out.dTypeRec, InpReLabel, Inp.dTypeRec, RndSat.roundingMode, RndSat.overflowMode)>/
%<FixPt_Fix2FixAlwaysOutput(OutImLabel, Out.dTypeRec, InpImLabel, Inp.dTypeRec, RndSat.roundingMode, RndSat.overflowMode)>/
%else
%<FixPt_Fix2FixAlwaysOutput(OutReLabel, Out.dTypeRec, Inp.label, Inp.dTypeRec, RndSat.roundingMode, RndSat.overflowMode)>/
%<OutImLabel> = %<FixPt_GetGroundValueOrNameFromDataTypeRec(Out.dTypeRec, TLC_FALSE)>;
%endif
%elseif (Inp.isComplex == 0)
%<FixPt_Fix2FixAlwaysOutput(Out.label, Out.dTypeRec, Inp.label, Inp.dTypeRec, RndSat.roundingMode, RndSat.overflowMode)>/
%else
%error "DSPFixptLibEquals: assignment of a complex value into a real variable not supported."
%endif
%endif
%endfunction
%function DSPFixptNegate(Out, Inp, RndSat) Output
%<Out.label> = %<FixPt_GetGroundValueOrNameFromDataTypeRec(Out.dTypeRec, Out.isComplex)>;
%if (Out.isComplex)
%assign OutReLabel = Out.label + ".re"
%assign OutImLabel = Out.label + ".im"
%endif
%if (Inp.isComplex)
%assign InpReLabel = Inp.label + ".re"
%assign InpImLabel = Inp.label + ".im"
%if (Out.isComplex)
/* %<Out.label> = -(%<Inp.label>) */
%<FixPt_AccumNeg_Easy(OutReLabel, Out.dTypeRec, InpReLabel, Inp.dTypeRec, RndSat.roundingMode, RndSat.overflowMode)>/
%<FixPt_AccumNeg_Easy(OutImLabel, Out.dTypeRec, InpImLabel, Inp.dTypeRec, RndSat.roundingMode, RndSat.overflowMode)>/
%else
%error "DSPFixptNegate: storing the negative of a complex value in a real variable is not supported."
%endif
%else
%if (Out.isComplex)
%<FixPt_AccumNeg_Easy(OutReLabel, Out.dTypeRec, Inp.label, Inp.dTypeRec, RndSat.roundingMode, RndSat.overflowMode)>/
%else
%<FixPt_AccumNeg_Easy(Out.label, Out.dTypeRec, Inp.label, Inp.dTypeRec, RndSat.roundingMode, RndSat.overflowMode)>/
%endif
%endif
%endfunction
%function DSPFixptLibConjugate(Out, Inp, RndSat) Output
%if (Inp.isComplex)
%if (Out.isComplex)
%assign InpReLabel = Inp.label + ".re"
%assign InpImLabel = Inp.label + ".im"
%assign OutReLabel = Out.label + ".re"
%assign OutImLabel = Out.label + ".im"
/* %<Out.label> = conj(%<Inp.label>) */
%<FixPt_Fix2FixAlwaysOutput(OutReLabel, Out.dTypeRec, InpReLabel, Inp.dTypeRec, RndSat.roundingMode, RndSat.overflowMode)>/
%<OutImLabel> = %<FixPt_GetGroundValueOrNameFromDataTypeRec(Out.dTypeRec, TLC_FALSE)>;
%<FixPt_AccumNeg_Easy(OutImLabel, Out.dTypeRec, InpImLabel, Inp.dTypeRec, RndSat.roundingMode, RndSat.overflowMode)>/
%else
%error "DSPFixptLibConjugate: storing the conjugate of a complex value in a real variable is not supported."
%endif
%else
%<DSPFixptLibEquals(Out,Inp,RndSat)>
%endif
%endfunction
%function DSPFixptLibPlusEquals(Acc, Inp, RndSat) Output
%if (Acc.isComplex)
%if (Inp.isComplex)
/* %<Acc.label> += %<Inp.label> */
%<DSPFixptLibCplxPlusEquals(Acc, Inp, RndSat)>/
%else
%<DSPFixptLibCplxRealPlusEquals(Acc, Inp, RndSat)>/
%endif
%elseif (Inp.isComplex == 0)
%<DSPFixptLibRealPlusEquals(Acc, Inp, RndSat)>/
%else
%error "DSPFixptLibPlusEquals: assignment of a complex value into a real variable not supported."
%endif
%endfunction
%function DSPFixptLibMinusEquals(Acc, Inp, RndSat) Output
%if (Acc.isComplex)
%if (Inp.isComplex)
/* %<Acc.label> -= %<Inp.label> */
%<DSPFixptLibCplxMinusEquals(Acc, Inp, RndSat)>/
%else
%<DSPFixptLibCplxRealMinusEquals(Acc, Inp, RndSat)>/
%endif
%elseif (Inp.isComplex == 0)
%<DSPFixptLibRealMinusEquals(Acc, Inp, RndSat)>/
%else
%error "DSPFixptLibMinusEquals: assignment of a complex value into a real variable not supported."
%endif
%endfunction
%function DSPFixptLibTimesEquals(PrdOut, Inp, RndSat) Output
%if (PrdOut.isComplex)
%if (Inp.isComplex)
%error "DSPFixptLibTimesEquals: incorrect usage. Use DSPFixptLibCplxTimesEquals instead."
%else
%<DSPFixptLibCplxRealTimesEquals(PrdOut, Inp, RndSat)>
%endif
%elseif (Inp.isComplex == 0)
%<DSPFixptLibRealTimesEquals(PrdOut, Inp, RndSat)>
%else
%error "DSPFixptLibTimesEquals: assignment of a complex value into a real variable not supported."
%endif
%endfunction
%function DSPFixptLibTimes(PrdOut, In1, In2, RndSat) Output
%if (PrdOut.isComplex)
%if ((In1.isComplex) && (In2.isComplex))
%error "DSPFixptLibTimes: incorrect usage. Use DSPFixptLibCplxTimes instead."
%elseif (In1.isComplex)
%<DSPFixptLibCplxRealCplxTimes(PrdOut, In2, In1, RndSat)>
%elseif (In2.isComplex)
%<DSPFixptLibCplxRealCplxTimes(PrdOut, In1, In2, RndSat)>
%else
%<DSPFixptLibRealTimes(PrdOut, In1, In2, RndSat)>
%assign OutImLabel = PrdOut.label + ".im"
%<OutImLabel> = %<FixPt_GetGroundValueOrNameFromDataTypeRec(Out.dTypeRec, TLC_FALSE)>;
%endif
%else
%if ((In1.isComplex == 0) && (In2.isComplex == 0))
%<DSPFixptLibRealTimes(PrdOut, In1, In2, RndSat)>
%else
%error "DSPFixptLibTimes: assignment of a complex value into a real variable not supported."
%endif
%endif
%endfunction
%function DSPFixptLibCplxTimesEquals(Acc, Inp, PrdOut, RndSat) Output
%if ( PrdOut.isComplex || ((Acc.isComplex != 1) || (Inp.isComplex != 1)) )
%error "DSPFixptLibCplxTimesEquals: PrdOut must be real. Acc and Inp must be complex."
%else
%<DSPFixptLibCplxTimes(Acc, Acc, Inp, PrdOut, RndSat)>
%endif
%endfunction
%function DSPFixptLibCplxTimes(Acc, In1, In2, PrdOut, RndSat) Output
%if ( PrdOut.isComplex || ((Acc.isComplex != 1) || (In1.isComplex != 1) || (In2.isComplex != 1)) )
%error "DSPFixptLibCplxTimes: PrdOut must be real. Acc, In1, and In2 must be complex."
%else
%assign AccLabelRe = Acc.label + ".re"
%assign AccLabelIm = Acc.label + ".im"
%assign In1LabelRe = In1.label + ".re"
%assign In1LabelIm = In1.label + ".im"
%assign In2LabelRe = In2.label + ".re"
%assign In2LabelIm = In2.label + ".im"
%assign AccWordLength = Acc.dTypeRec.RequiredBits
%assign PrdOutWordLength = PrdOut.dTypeRec.RequiredBits
%assign AccWL_GTE_PrdWL = (AccWordLength >= PrdOutWordLength)
%assign AccLSBScaling = Acc.dTypeRec.FixedExp
%assign PrdOutLSBScaling = PrdOut.dTypeRec.FixedExp
%assign AccScl_EQ_PrdScl = (AccLSBScaling == PrdOutLSBScaling)
%assign okToUseAccAsPrdOutTemp = (AccWL_GTE_PrdWL && AccScl_EQ_PrdScl)
%if ((Acc.label != In1.label) && (Acc.label != In2.label))
%if (okToUseAccAsPrdOutTemp)
%<FixPt_Multiply(AccLabelRe, PrdOut.dTypeRec, In1LabelRe, In1.dTypeRec, In2LabelRe, In2.dTypeRec, RndSat.roundingMode, RndSat.overflowMode)>/
%else
%<FixPt_Multiply(PrdOut.label, PrdOut.dTypeRec, In1LabelRe, In1.dTypeRec, In2LabelRe, In2.dTypeRec, RndSat.roundingMode, RndSat.overflowMode)>/
%<FixPt_Fix2FixAlwaysOutput(AccLabelRe, Acc.dTypeRec, PrdOut.label, PrdOut.dTypeRec, RndSat.roundingMode, RndSat.overflowMode)>/
%endif
%<FixPt_Multiply(PrdOut.label, PrdOut.dTypeRec, In1LabelIm, In1.dTypeRec, In2LabelIm, In2.dTypeRec, RndSat.roundingMode, RndSat.overflowMode)>/
%<FixPt_AccumNeg_Easy(AccLabelRe, Acc.dTypeRec, PrdOut.label, PrdOut.dTypeRec, RndSat.roundingMode, RndSat.overflowMode)>/
%if (okToUseAccAsPrdOutTemp)
%<FixPt_Multiply(AccLabelIm, PrdOut.dTypeRec, In1LabelRe, In1.dTypeRec, In2LabelIm, In2.dTypeRec, RndSat.roundingMode, RndSat.overflowMode)>/
%else
%<FixPt_Multiply(PrdOut.label, PrdOut.dTypeRec, In1LabelRe, In1.dTypeRec, In2LabelIm, In2.dTypeRec, RndSat.roundingMode, RndSat.overflowMode)>/
%<FixPt_Fix2FixAlwaysOutput(AccLabelIm, Acc.dTypeRec, PrdOut.label, PrdOut.dTypeRec, RndSat.roundingMode, RndSat.overflowMode)>/
%endif
%<FixPt_Multiply(PrdOut.label, PrdOut.dTypeRec, In1LabelIm, In1.dTypeRec, In2LabelRe, In2.dTypeRec, RndSat.roundingMode, RndSat.overflowMode)>/
%<FixPt_AccumPos_Easy(AccLabelIm, Acc.dTypeRec, PrdOut.label, PrdOut.dTypeRec, RndSat.roundingMode, RndSat.overflowMode)>/
%else
%error "dspfixptlib: in-place complex multiply not presently implemented."
%endif
%endif
%endfunction
%function DSPFixptLibRealPlusEquals(Acc, Inp, RndSat) Output
%<FixPt_AccumPos_Easy(Acc.label, Acc.dTypeRec, Inp.label, Inp.dTypeRec, RndSat.roundingMode, RndSat.overflowMode)>/
%endfunction
%function DSPFixptLibCplxPlusEquals(Acc, Inp, RndSat) Output
%assign InpReLabel = Inp.label + ".re"
%assign AccReLabel = Acc.label + ".re"
%<FixPt_AccumPos_Easy(AccReLabel, Acc.dTypeRec, InpReLabel, Inp.dTypeRec, RndSat.roundingMode, RndSat.overflowMode)>/
%assign InpImLabel = Inp.label + ".im"
%assign AccImLabel = Acc.label + ".im"
%<FixPt_AccumPos_Easy(AccImLabel, Acc.dTypeRec, InpImLabel, Inp.dTypeRec, RndSat.roundingMode, RndSat.overflowMode)>/
%endfunction
%function DSPFixptLibCplxRealPlusEquals(Acc, Inp, RndSat) Output
%assign AccReLabel = Acc.label + ".re"
%<FixPt_AccumPos_Easy(AccReLabel, Acc.dTypeRec, Inp.label, Inp.dTypeRec, RndSat.roundingMode, RndSat.overflowMode)>/
%endfunction
%function DSPFixptLibRealMinusEquals(Acc, Inp, RndSat) Output
%<FixPt_AccumNeg_Easy(Acc.label, Acc.dTypeRec, Inp.label, Inp.dTypeRec, RndSat.roundingMode, RndSat.overflowMode)>/
%endfunction
%function DSPFixptLibCplxMinusEquals(Acc, Inp, RndSat) Output
%assign InpReLabel = Inp.label + ".re"
%assign AccReLabel = Acc.label + ".re"
%<FixPt_AccumNeg_Easy(AccReLabel, Acc.dTypeRec, InpReLabel, Inp.dTypeRec, RndSat.roundingMode, RndSat.overflowMode)>/
%assign InpImLabel = Inp.label + ".im"
%assign AccImLabel = Acc.label + ".im"
%<FixPt_AccumNeg_Easy(AccImLabel, Acc.dTypeRec, InpImLabel, Inp.dTypeRec, RndSat.roundingMode, RndSat.overflowMode)>/
%endfunction
%function DSPFixptLibCplxRealMinusEquals(Acc, Inp, RndSat) Output
%assign AccReLabel = Acc.label + ".re"
%<FixPt_AccumNeg_Easy(AccReLabel, Acc.dTypeRec, Inp.label, Inp.dTypeRec, RndSat.roundingMode, RndSat.overflowMode)>/
%endfunction
%function DSPFixptLibCplxRealTimesEquals(PrdOut, Inp, RndSat) Output
%assign PrdOutReLabel = PrdOut.label + ".re"
%<FixPt_Multiply(PrdOutReLabel, PrdOut.dTypeRec, PrdOutReLabel, PrdOut.dTypeRec, Inp.label, Inp.dTypeRec, RndSat.roundingMode, RndSat.overflowMode)>/
%assign PrdOutImLabel = PrdOut.label + ".im"
%<FixPt_Multiply(PrdOutImLabel, PrdOut.dTypeRec, PrdOutImLabel, PrdOut.dTypeRec, Inp.label, Inp.dTypeRec, RndSat.roundingMode, RndSat.overflowMode)>/
%endfunction
%function DSPFixptLibRealTimesEquals(PrdOut, Inp, RndSat) Output
%<FixPt_Multiply(PrdOut.label, PrdOut.dTypeRec, PrdOut.label, PrdOut.dTypeRec, Inp.label, Inp.dTypeRec, RndSat.roundingMode, RndSat.overflowMode)>/
%endfunction
%function DSPFixptLibCplxRealCplxTimes(PrdOut, In1, In2, RndSat) Output
%assign PrdOutReLabel = PrdOut.label + ".re"
%assign In2Relabel = In2.label + ".re"
%<FixPt_Multiply(PrdOutReLabel, PrdOut.dTypeRec, In1.label, In1.dTypeRec, In2Relabel, In2.dTypeRec, RndSat.roundingMode, RndSat.overflowMode)>/
%assign PrdOutImLabel = PrdOut.label + ".im"
%assign In2Imlabel = In2.label + ".im"
%<FixPt_Multiply(PrdOutImLabel, PrdOut.dTypeRec, In1.label, In1.dTypeRec, In2Imlabel, In2.dTypeRec, RndSat.roundingMode, RndSat.overflowMode)>/
%endfunction
%function DSPFixptLibRealTimes(PrdOut, In1, In2, RndSat) Output
%<FixPt_Multiply(PrdOut.label, PrdOut.dTypeRec, In1.label, In1.dTypeRec, In2.label, In2.dTypeRec, RndSat.roundingMode, RndSat.overflowMode)>/
%endfunction
%function FixptMAC(accRec, opStr, prodRec, u1Rec, u2Rec, rndSatRec) Output
%assign opMACPlusEquals = 1
%assign opMACMinusEquals = 2
%assign opMACEquals = 3
%if ISEQUAL(opStr,"+=")
%assign opMAC = opMACPlusEquals
%elseif ISEQUAL(opStr,"-=")
%assign opMAC = opMACMinusEquals
%elseif ISEQUAL(opStr,"=")
%assign opMAC = opMACEquals
%else
%error "Invalid operation string passed to FixptMAC function. Valid choices are '+=', '-=', and '='"
%return
%endif
%assign accLabel = accRec.label
%assign accDTRec = accRec.dTypeRec
%assign accIsComplex = accRec.isComplex
%assign accIsReal = !(accIsComplex)
%if (accIsComplex)
%assign accReLabel = accLabel + ".re"
%assign accImLabel = accLabel + ".im"
%endif
%assign u1Label = u1Rec.label
%assign u1DTRec = u1Rec.dTypeRec
%assign u1IsComplex = u1Rec.isComplex
%assign u1IsReal = !(u1IsComplex)
%if (u1IsComplex)
%assign u1ReLabel = u1Label + ".re"
%assign u1ImLabel = u1Label + ".im"
%endif
%assign u2Label = u2Rec.label
%assign u2DTRec = u2Rec.dTypeRec
%assign u2IsComplex = u2Rec.isComplex
%assign u2IsReal = !(u2IsComplex)
%if (u2IsComplex)
%assign u2ReLabel = u2Label + ".re"
%assign u2ImLabel = u2Label + ".im"
%endif
%assign prodLabel = prodRec.label
%assign prodDTRec = prodRec.dTypeRec
%if prodRec.isComplex
%assign prodLabel = prodRec.label + ".re"
%else
%endif
%assign rndMode = rndSatRec.roundingMode
%assign satMode = rndSatRec.overflowMode
%if (u1IsReal && u2IsReal)
%if (accIsComplex)
%assign accLabel = accReLabel
%endif
%<FixPt_Multiply(prodLabel, prodDTRec, u1Label, u1DTRec, u2Label, u2DTRec, rndMode, satMode)>/
%switch opMAC
%case opMACPlusEquals
%<FixPt_AccumPos_Easy(accLabel, accDTRec, prodLabel, prodDTRec, rndMode, satMode)>/
%break
%case opMACMinusEquals
%<FixPt_AccumNeg_Easy(accLabel, accDTRec, prodLabel, prodDTRec, rndMode, satMode)>/
%break
%case opMACEquals
%<FixPt_Fix2FixAlwaysOutput(accLabel, accDTRec, prodLabel, prodDTRec, rndMode, satMode)>/
%if (accIsComplex)
%<accImLabel> = %<FixPt_GetGroundValueOrNameFromDataTypeRec(accDTRec, TLC_FALSE)>;
%endif
%break
%endswitch
%else
%if accIsReal
%error "Accumulator must be complex when multiplying and accumulating complex numbers using the FixptMAC function"
%endif
/* prod = %<u1Rec.label> * %<u2Rec.label> */
/* acc %<opStr> prod */
%if ((u1IsReal && u2IsComplex) || (u1IsComplex && u2IsReal))
%if (u1IsComplex)
%assign u1DTRec = u2Rec.dTypeRec
%assign u1Label = u2Label
%assign u2DTRec = u1Rec.dTypeRec
%assign u2ReLabel = u1ReLabel
%assign u2ImLabel = u1ImLabel
%endif
%switch opMAC
%case opMACPlusEquals
%<FixPt_Multiply(prodLabel, prodDTRec, u1Label, u1DTRec, u2ReLabel, u2DTRec, rndMode, satMode)>/
%<FixPt_AccumPos_Easy(accReLabel, accDTRec, prodLabel, prodDTRec, rndMode, satMode)>/
%<FixPt_Multiply(prodLabel, prodDTRec, u1Label, u1DTRec, u2ImLabel, u2DTRec, rndMode, satMode)>/
%<FixPt_AccumPos_Easy(accImLabel, accDTRec, prodLabel, prodDTRec, rndMode, satMode)>/
%break
%case opMACMinusEquals
%<FixPt_Multiply(prodLabel, prodDTRec, u1Label, u1DTRec, u2ReLabel, u2DTRec, rndMode, satMode)>/
%<FixPt_AccumNeg_Easy(accReLabel, accDTRec, prodLabel, prodDTRec, rndMode, satMode)>/
%<FixPt_Multiply(prodLabel, prodDTRec, u1Label, u1DTRec, u2ImLabel, u2DTRec, rndMode, satMode)>/
%<FixPt_AccumNeg_Easy(accImLabel, accDTRec, prodLabel, prodDTRec, rndMode, satMode)>/
%break
%case opMACEquals
%<FixPt_Multiply(prodLabel, prodDTRec, u1Label, u1DTRec, u2ReLabel, u2DTRec, rndMode, satMode)>/
%<FixPt_Fix2FixAlwaysOutput(accReLabel, accDTRec, prodLabel, prodDTRec, rndMode, satMode)>/
%<FixPt_Multiply(prodLabel, prodDTRec, u1Label, u1DTRec, u2ImLabel, u2DTRec, rndMode, satMode)>/
%<FixPt_Fix2FixAlwaysOutput(accImLabel, accDTRec, prodLabel, prodDTRec, rndMode, satMode)>/
%break
%endswitch
%else
%switch opMAC
%case opMACPlusEquals
%if (satMode == "Wrap")
%<FixPt_Multiply(prodLabel, prodDTRec, u1ReLabel, u1DTRec, u2ReLabel, u2DTRec, rndMode, satMode)>/
%<FixPt_AccumPos_Easy(accReLabel, accDTRec, prodLabel, prodDTRec, rndMode, satMode)>/
%<FixPt_Multiply(prodLabel, prodDTRec, u1ImLabel, u1DTRec, u2ImLabel, u2DTRec, rndMode, satMode)>/
%<FixPt_AccumNeg_Easy(accReLabel, accDTRec, prodLabel, prodDTRec, rndMode, satMode)>/
%<FixPt_Multiply(prodLabel, prodDTRec, u1ReLabel, u1DTRec, u2ImLabel, u2DTRec, rndMode, satMode)>/
%<FixPt_AccumPos_Easy(accImLabel, accDTRec, prodLabel, prodDTRec, rndMode, satMode)>/
%<FixPt_Multiply(prodLabel, prodDTRec, u1ImLabel, u1DTRec, u2ReLabel, u2DTRec, rndMode, satMode)>/
%<FixPt_AccumPos_Easy(accImLabel, accDTRec, prodLabel, prodDTRec, rndMode, satMode)>/
%else
%copyrecord tmpAccRec accRec
%assign tmpAccRec.label = accRec.label + "Tmp"
%assign tmpAccRec.isComplex = 0
{
%<accDTRec.Name> %<tmpAccRec.label>;
%<FixPt_Multiply(prodLabel, prodDTRec, u1ReLabel, u1DTRec, u2ReLabel, u2DTRec, rndMode, satMode)>/
%<FixPt_Fix2FixAlwaysOutput(tmpAccRec.label, accDTRec, prodLabel, prodDTRec, rndMode, satMode)>/
%<FixPt_Multiply(prodLabel, prodDTRec, u1ImLabel, u1DTRec, u2ImLabel, u2DTRec, rndMode, satMode)>/
%<FixPt_AccumNeg_Easy(tmpAccRec.label, accDTRec, prodLabel, prodDTRec, rndMode, satMode)>/
%<FixPt_AccumPos_Easy(accReLabel, accDTRec, tmpAccRec.label, accDTRec, rndMode, satMode)>/
%<FixPt_Multiply(prodLabel, prodDTRec, u1ReLabel, u1DTRec, u2ImLabel, u2DTRec, rndMode, satMode)>/
%<FixPt_Fix2FixAlwaysOutput(tmpAccRec.label, accDTRec, prodLabel, prodDTRec, rndMode, satMode)>/
%<FixPt_Multiply(prodLabel, prodDTRec, u1ImLabel, u1DTRec, u2ReLabel, u2DTRec, rndMode, satMode)>/
%<FixPt_AccumPos_Easy(tmpAccRec.label, accDTRec, prodLabel, prodDTRec, rndMode, satMode)>/
%<FixPt_AccumPos_Easy(accImLabel, accDTRec, tmpAccRec.label, accDTRec, rndMode, satMode)>/
}
%endif
%break
%case opMACMinusEquals
%if (satMode == "Wrap")
%<FixPt_Multiply(prodLabel, prodDTRec, u1ReLabel, u1DTRec, u2ReLabel, u2DTRec, rndMode, satMode)>/
%<FixPt_AccumNeg_Easy(accReLabel, accDTRec, prodLabel, prodDTRec, rndMode, satMode)>/
%<FixPt_Multiply(prodLabel, prodDTRec, u1ImLabel, u1DTRec, u2ImLabel, u2DTRec, rndMode, satMode)>/
%<FixPt_AccumPos_Easy(accReLabel, accDTRec, prodLabel, prodDTRec, rndMode, satMode)>/
%<FixPt_Multiply(prodLabel, prodDTRec, u1ReLabel, u1DTRec, u2ImLabel, u2DTRec, rndMode, satMode)>/
%<FixPt_AccumNeg_Easy(accImLabel, accDTRec, prodLabel, prodDTRec, rndMode, satMode)>/
%<FixPt_Multiply(prodLabel, prodDTRec, u1ImLabel, u1DTRec, u2ReLabel, u2DTRec, rndMode, satMode)>/
%<FixPt_AccumNeg_Easy(accImLabel, accDTRec, prodLabel, prodDTRec, rndMode, satMode)>/
%else
%copyrecord tmpAccRec accRec
%assign tmpAccRec.label = accRec.label + "Tmp"
%assign tmpAccRec.isComplex = 0
{
%<accDTRec.Name> %<tmpAccRec.label>;
%<FixPt_Multiply(prodLabel, prodDTRec, u1ReLabel, u1DTRec, u2ReLabel, u2DTRec, rndMode, satMode)>/
%<FixPt_Fix2FixAlwaysOutput(tmpAccRec.label, accDTRec, prodLabel, prodDTRec, rndMode, satMode)>/
%<FixPt_Multiply(prodLabel, prodDTRec, u1ImLabel, u1DTRec, u2ImLabel, u2DTRec, rndMode, satMode)>/
%<FixPt_AccumNeg_Easy(tmpAccRec.label, accDTRec, prodLabel, prodDTRec, rndMode, satMode)>/
%<FixPt_AccumNeg_Easy(accReLabel, accDTRec, tmpAccRec.label, accDTRec, rndMode, satMode)>/
%<FixPt_Multiply(prodLabel, prodDTRec, u1ReLabel, u1DTRec, u2ImLabel, u2DTRec, rndMode, satMode)>/
%<FixPt_Fix2FixAlwaysOutput(tmpAccRec.label, accDTRec, prodLabel, prodDTRec, rndMode, satMode)>/
%<FixPt_Multiply(prodLabel, prodDTRec, u1ImLabel, u1DTRec, u2ReLabel, u2DTRec, rndMode, satMode)>/
%<FixPt_AccumPos_Easy(tmpAccRec.label, accDTRec, prodLabel, prodDTRec, rndMode, satMode)>/
%<FixPt_AccumNeg_Easy(accImLabel, accDTRec, tmpAccRec.label, accDTRec, rndMode, satMode)>/
}
%endif
%break
%case opMACEquals
%<FixPt_Multiply(prodLabel, prodDTRec, u1ReLabel, u1DTRec, u2ReLabel, u2DTRec, rndMode, satMode)>/
%<FixPt_Fix2FixAlwaysOutput(accReLabel, accDTRec, prodLabel, prodDTRec, rndMode, satMode)>/
%<FixPt_Multiply(prodLabel, prodDTRec, u1ImLabel, u1DTRec, u2ImLabel, u2DTRec, rndMode, satMode)>/
%<FixPt_AccumNeg_Easy(accReLabel, accDTRec, prodLabel, prodDTRec, rndMode, satMode)>/
%<FixPt_Multiply(prodLabel, prodDTRec, u1ReLabel, u1DTRec, u2ImLabel, u2DTRec, rndMode, satMode)>/
%<FixPt_Fix2FixAlwaysOutput(accImLabel, accDTRec, prodLabel, prodDTRec, rndMode, satMode)>/
%<FixPt_Multiply(prodLabel, prodDTRec, u1ImLabel, u1DTRec, u2ReLabel, u2DTRec, rndMode, satMode)>/
%<FixPt_AccumPos_Easy(accImLabel, accDTRec, prodLabel, prodDTRec, rndMode, satMode)>/
%break
%endswitch
%endif
%endif
%endfunction
%function DSPFixptLibDivide(quot, num, den, RndSat) Output
%if (den.isComplex)
%error "DSPFixptLibDivide: complex denominator is not supported."
%endif
%if ((num.isComplex) && !(quot.isComplex) )
%error "DSPFixptLibDivide: quotient must be complex when numerator is complex."
%endif
%if (num.isComplex)
%assign quotReLabel = quot.label + ".re"
%assign quotImLabel = quot.label + ".im"
%assign numReLabel = num.label + ".re"
%assign numImLabel = num.label + ".im"
/* %<quotReLabel> = %<numReLabel> / %<den.label> */
%<FixPt_Division(quotReLabel,quot.dTypeRec,numReLabel,num.dTypeRec,den.label,den.dTypeRec,RndSat.roundingMode,RndSat.overflowMode)>/
/* %<quotImLabel> = %<numImLabel> / %<den.label> */
%<FixPt_Division(quotImLabel,quot.dTypeRec,numImLabel,num.dTypeRec,den.label,den.dTypeRec,RndSat.roundingMode,RndSat.overflowMode)>/
%else
/* %<quot.label> = %<num.label> / %<den.label> */
%<FixPt_Division(quot.label,quot.dTypeRec,num.label,num.dTypeRec,den.label,den.dTypeRec,RndSat.roundingMode,RndSat.overflowMode)>/
%endif
%endfunction
%function DSPFixptLibDivide2(quot, num, den, RndSat) Output
%if (den.isComplex)
%assign denReLabel = den.label + ".re"
%else
%assign denReLabel = den.label
%endif
%if (num.isComplex)
%assign numReLabel = num.label + ".re"
%assign numImLabel = num.label + ".im"
%if (quot.isComplex)
%assign quotReLabel = quot.label + ".re"
%assign quotImLabel = quot.label + ".im"
/* %<quotReLabel> = %<numReLabel> / %<denReLabel> */
%<FixPt_Division(quotReLabel,quot.dTypeRec,numReLabel,num.dTypeRec,denReLabel,den.dTypeRec,RndSat.roundingMode,RndSat.overflowMode)>/
/* %<quotImLabel> = %<numImLabel> / %<denReLabel> */
%<FixPt_Division(quotImLabel,quot.dTypeRec,numImLabel,num.dTypeRec,denReLabel,den.dTypeRec,RndSat.roundingMode,RndSat.overflowMode)>/
%else
/* %<quot.label> = %<numReLabel> / %<denReLabel> */
%<FixPt_Division(quot.label,quot.dTypeRec,numReLabel,num.dTypeRec,denReLabel,den.dTypeRec,RndSat.roundingMode,RndSat.overflowMode)>/
%endif
%else
%if (quot.isComplex)
%assign quotReLabel = quot.label + ".re"
%assign quotImLabel = quot.label + ".im"
/* %<quotReLabel> = %<num.label> / %<denReLabel> */
%<FixPt_Division(quotReLabel,quot.dTypeRec,num.label,num.dTypeRec,denReLabel,den.dTypeRec,RndSat.roundingMode,RndSat.overflowMode)>/
%<quotImLabel> = %<FixPt_GetGroundValueOrNameFromDataTypeRec(quot.dTypeRec, TLC_FALSE)>;
%else
/* %<quot.label> = %<num.label> / %<denReLabel> */
%<FixPt_Division(quot.label,quot.dTypeRec,num.label,num.dTypeRec,denReLabel,den.dTypeRec,RndSat.roundingMode,RndSat.overflowMode)>/
%endif
%endif
%endfunction
%function DSPFixptLibNorm(Acc, In, PrdOut, RndSat) Output
%if (Acc.isComplex)
%error "DSPFixptLibNorm: Acc record must be real."
%endif
%if (PrdOut.isComplex)
%error "DSPFixptLibNorm: PrdOut record must be real."
%endif
/* %<Acc.label> = norm(%<In.label>) */
%if (In.isComplex)
%assign InLabelRe = In.label + ".re"
%assign InLabelIm = In.label + ".im"
%<FixPt_Multiply(PrdOut.label, PrdOut.dTypeRec, InLabelRe, In.dTypeRec, InLabelRe, In.dTypeRec, RndSat.roundingMode, RndSat.overflowMode)>/
%<FixPt_Fix2FixAlwaysOutput(Acc.label, Acc.dTypeRec, PrdOut.label, PrdOut.dTypeRec, RndSat.roundingMode, RndSat.overflowMode)>/
%<FixPt_Multiply(PrdOut.label, PrdOut.dTypeRec, InLabelIm, In.dTypeRec, InLabelIm, In.dTypeRec, RndSat.roundingMode, RndSat.overflowMode)>/
%<FixPt_AccumPos_Easy(Acc.label, Acc.dTypeRec, PrdOut.label, PrdOut.dTypeRec, RndSat.roundingMode, RndSat.overflowMode)>/
%else
%<FixPt_Multiply(PrdOut.label, PrdOut.dTypeRec, In.label, In.dTypeRec, In.label, In.dTypeRec, RndSat.roundingMode, RndSat.overflowMode)>/
%<FixPt_Fix2FixAlwaysOutput(Acc.label, Acc.dTypeRec, PrdOut.label, PrdOut.dTypeRec, RndSat.roundingMode, RndSat.overflowMode)>/
%endif
%endfunction
%function DSPFixptRealAbs(Out, Inp, RndSat) Output
%assign isMultiWordInput = FixPt_DataTypeIsMultiWord(Inp.dTypeRec)
%if isMultiWordInput
{
%assign boolDT = DataTypes.DataType[tSS_BOOLEAN]
%<boolDT.NativeType> isNegative;
%assign grndValueOrName = FixPt_GetGroundValueOrNameFromDataTypeRec(Inp.dTypeRec, TLC_FALSE)
%<FixPt_MultiWordCompLT("isNegative", boolDT, Inp.label, Inp.dTypeRec, grndValueOrName, Inp.dTypeRec, "Simplest", "Saturate")>/
if (isNegative) {
%else
if (%<Inp.label> < 0) {
%endif
/* Negate the (negative) value */
%<Out.label> = %<FixPt_GetGroundValueOrNameFromDataTypeRec(Out.dTypeRec, TLC_FALSE)>;
%<FixPt_AccumNeg_Easy(Out.label, Out.dTypeRec, Inp.label, Inp.dTypeRec, RndSat.roundingMode, RndSat.overflowMode)>/
} else {
/* Assign the (non-negative) value */
%<FixPt_Fix2FixAlwaysOutput(Out.label, Out.dTypeRec, Inp.label, Inp.dTypeRec, RndSat.roundingMode, RndSat.overflowMode)>/
}
%if isMultiWordInput
}
%endif
%endfunction
%endif