Starting implementation of rotatation, not yet usable.
This commit is contained in:
parent
cd1008706b
commit
b7c115ee7e
|
@ -25,6 +25,9 @@
|
||||||
Author: Frédéric Pétrot
|
Author: Frédéric Pétrot
|
||||||
Date : 1/10/2000
|
Date : 1/10/2000
|
||||||
$Log: dpgen_Shifter.c,v $
|
$Log: dpgen_Shifter.c,v $
|
||||||
|
Revision 1.3 2002/06/13 15:38:39 fred
|
||||||
|
Starting implementation of rotatation, not yet usable.
|
||||||
|
|
||||||
Revision 1.2 2002/06/12 16:11:08 fred
|
Revision 1.2 2002/06/12 16:11:08 fred
|
||||||
Minor editing modifications
|
Minor editing modifications
|
||||||
|
|
||||||
|
@ -83,7 +86,7 @@
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static char rcsid[]="$Id: dpgen_Shifter.c,v 1.2 2002/06/12 16:11:08 fred Exp $";
|
static char rcsid[]="$Id: dpgen_Shifter.c,v 1.3 2002/06/13 15:38:39 fred Exp $";
|
||||||
|
|
||||||
|
|
||||||
#include "util_Defs.h"
|
#include "util_Defs.h"
|
||||||
|
@ -129,15 +132,18 @@ namegen(c0)
|
||||||
namegen(c1)
|
namegen(c1)
|
||||||
namegen(shamt)
|
namegen(shamt)
|
||||||
namegen(op)
|
namegen(op)
|
||||||
|
namegen(x)
|
||||||
|
|
||||||
/* Behavior:
|
/* Behavior:
|
||||||
|
|
||||||
o = (i op shamt);
|
o = (i op shamt);
|
||||||
|
|
||||||
where op is :
|
where op is :
|
||||||
X0 : logical left shift
|
0X0 : logical left shift
|
||||||
01 : logical right shift
|
001 : logical right shift
|
||||||
11 : arithmetical right shift
|
011 : arithmetical right shift
|
||||||
|
1X0 : left rotation
|
||||||
|
1X1 : right rotation
|
||||||
*/
|
*/
|
||||||
extern void dpgen_Shifter(aFunction, aAL)
|
extern void dpgen_Shifter(aFunction, aAL)
|
||||||
long aFunction;
|
long aFunction;
|
||||||
|
@ -149,15 +155,21 @@ extern void dpgen_Shifter(aFunction, aAL)
|
||||||
int Slices;
|
int Slices;
|
||||||
int BitIndex, SliceIndex;
|
int BitIndex, SliceIndex;
|
||||||
int LeftIndex, RightIndex;
|
int LeftIndex, RightIndex;
|
||||||
|
int AndIndex = 0;
|
||||||
|
int ops;
|
||||||
char *LSB, *MSB;
|
char *LSB, *MSB;
|
||||||
char *MuxInput0, *MuxInput1, *MuxInput2; /* Mux inputs */
|
char *MuxInput0, *MuxInput1, *MuxInput2; /* Mux inputs */
|
||||||
int sym, mys;
|
int sym, mys;
|
||||||
|
|
||||||
modelName = va_arg (aAL, char*);
|
modelName = va_arg (aAL, char*);
|
||||||
|
/* 0: Shifter
|
||||||
|
1: Includes also rotation */
|
||||||
flags = va_arg (aAL, long );
|
flags = va_arg (aAL, long );
|
||||||
|
flags = 0;
|
||||||
n = (int)va_arg (aAL, long );
|
n = (int)va_arg (aAL, long );
|
||||||
|
|
||||||
Slices = ln2p(n - 1);
|
Slices = ln2p(n - 1);
|
||||||
|
|
||||||
|
|
||||||
#define XX_NAME GENLIB_NAME
|
#define XX_NAME GENLIB_NAME
|
||||||
|
|
||||||
|
@ -176,9 +188,14 @@ extern void dpgen_Shifter(aFunction, aAL)
|
||||||
#define INV(k, i, nq) \
|
#define INV(k, i, nq) \
|
||||||
GENLIB_LOINS("inv_x2", XX_NAME("i_%d", k), i, nq, "vdd", "vss", NULL)
|
GENLIB_LOINS("inv_x2", XX_NAME("i_%d", k), i, nq, "vdd", "vss", NULL)
|
||||||
|
|
||||||
|
if (flags == 0)
|
||||||
|
ops = 1;
|
||||||
|
else
|
||||||
|
ops = 2;
|
||||||
|
|
||||||
GENLIB_DEF_LOFIG(modelName);
|
GENLIB_DEF_LOFIG(modelName);
|
||||||
|
|
||||||
GENLIB_LOCON(GENLIB_BUS("op", 1, 0), 'I', GENLIB_BUS("op", 1, 0));
|
GENLIB_LOCON(GENLIB_BUS("op", ops, 0), 'I', GENLIB_BUS("op", ops, 0));
|
||||||
GENLIB_LOCON(GENLIB_BUS("shamt", Slices - 1, 0), 'I', GENLIB_BUS("shamt", Slices - 1, 0));
|
GENLIB_LOCON(GENLIB_BUS("shamt", Slices - 1, 0), 'I', GENLIB_BUS("shamt", Slices - 1, 0));
|
||||||
GENLIB_LOCON(GENLIB_BUS("i", n - 1, 0), 'I', GENLIB_BUS("i", n - 1, 0));
|
GENLIB_LOCON(GENLIB_BUS("i", n - 1, 0), 'I', GENLIB_BUS("i", n - 1, 0));
|
||||||
GENLIB_LOCON(GENLIB_BUS("o", n - 1, 0), 'O', GENLIB_BUS("o", n - 1, 0));
|
GENLIB_LOCON(GENLIB_BUS("o", n - 1, 0), 'O', GENLIB_BUS("o", n - 1, 0));
|
||||||
|
@ -190,7 +207,8 @@ extern void dpgen_Shifter(aFunction, aAL)
|
||||||
MSB = "msb"; /* intermediate signal for arith sh */
|
MSB = "msb"; /* intermediate signal for arith sh */
|
||||||
|
|
||||||
/* Arithmetic extension */
|
/* Arithmetic extension */
|
||||||
A2(0, MuxOutput(n - 1), op(1), MSB);
|
if (flags == 0)
|
||||||
|
A2(AndIndex++, MuxOutput(n - 1), op(1), MSB);
|
||||||
|
|
||||||
/* Normalizing the input signals names */
|
/* Normalizing the input signals names */
|
||||||
for (BitIndex = 0; BitIndex < n; BitIndex++)
|
for (BitIndex = 0; BitIndex < n; BitIndex++)
|
||||||
|
@ -201,9 +219,25 @@ extern void dpgen_Shifter(aFunction, aAL)
|
||||||
for (BitIndex = 0; BitIndex < n; BitIndex++) {
|
for (BitIndex = 0; BitIndex < n; BitIndex++) {
|
||||||
LeftIndex = BitIndex - (1 << SliceIndex);
|
LeftIndex = BitIndex - (1 << SliceIndex);
|
||||||
RightIndex = BitIndex + (1 << SliceIndex);
|
RightIndex = BitIndex + (1 << SliceIndex);
|
||||||
MuxInput0 = LeftIndex >= 0 ? MuxOutput(SliceIndex * n + LeftIndex) : LSB;
|
if (flags == 0) {
|
||||||
MuxInput1 = MuxOutput(SliceIndex * n + BitIndex);
|
MuxInput0 = LeftIndex >= 0 ? MuxOutput(SliceIndex * n + LeftIndex) : LSB;
|
||||||
MuxInput2 = RightIndex < n ? MuxOutput(SliceIndex * n + RightIndex) : MSB;
|
MuxInput1 = MuxOutput(SliceIndex * n + BitIndex);
|
||||||
|
MuxInput2 = RightIndex < n ? MuxOutput(SliceIndex * n + RightIndex) : MSB;
|
||||||
|
} else {
|
||||||
|
if (LeftIndex >= 0)
|
||||||
|
MuxInput0 = MuxOutput(SliceIndex * n + LeftIndex);
|
||||||
|
else {
|
||||||
|
MuxInput0 = x(AndIndex);
|
||||||
|
A2(AndIndex, op(2), MuxOutput(SliceIndex * n + n - 1), x(AndIndex)); AndIndex++;
|
||||||
|
}
|
||||||
|
MuxInput1 = MuxOutput(SliceIndex * n + BitIndex);
|
||||||
|
if (RightIndex < n)
|
||||||
|
MuxInput2 = MuxOutput(SliceIndex * n + RightIndex);
|
||||||
|
else {
|
||||||
|
MuxInput2 = x(AndIndex);
|
||||||
|
A2(AndIndex, op(2), MuxOutput(SliceIndex * n + n - 1), x(AndIndex)); AndIndex++;
|
||||||
|
}
|
||||||
|
}
|
||||||
MX3(c0(SliceIndex), c1(SliceIndex), MuxInput0, MuxInput1, MuxInput2, MuxOutput((SliceIndex + 1) * n + BitIndex));
|
MX3(c0(SliceIndex), c1(SliceIndex), MuxInput0, MuxInput1, MuxInput2, MuxOutput((SliceIndex + 1) * n + BitIndex));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue