103 lines
2.3 KiB
C
103 lines
2.3 KiB
C
#include "fpga_cell_lut34.h"
|
|
#include "fpga_global.h"
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
/* LUT IN MUX Definitions */
|
|
static char LUT_IN_MUX[4][8] = {
|
|
{LUT_NET_F2, LUT_NET_L0, LUT_NET_L3, LUT_NET_L2, LUT_NET_L1, LUT_NET_F1, LUT_NET_F0, LUT_NET_T0},
|
|
{LUT_NET_F0, LUT_NET_F1, LUT_NET_L1, LUT_NET_L2, LUT_NET_L3, LUT_NET_L0, LUT_NET_F2, LUT_NET_T1},
|
|
{LUT_NET_F3, LUT_NET_L0, LUT_NET_L3, LUT_NET_L2, LUT_NET_L1, LUT_NET_F1, LUT_NET_F0, LUT_NET_T2},
|
|
{LUT_NET_F0, LUT_NET_F1, LUT_NET_L1, LUT_NET_L2, LUT_NET_L3, LUT_NET_L0, LUT_NET_F3, LUT_NET_T3}
|
|
};
|
|
static int LUT_IN_BITMAP[4][3] = {
|
|
{12, 11, 19},
|
|
{ 8, 9, 10},
|
|
{15, 14, 13},
|
|
{16, 17, 18}
|
|
};
|
|
|
|
|
|
static int fpga_cell_lut34_lut_get_mux(int lut, char port) {
|
|
int i;
|
|
|
|
if (port == LUT_NET_DC)
|
|
return 0;
|
|
|
|
for (i = 0; i < 8; ++i) {
|
|
if (LUT_IN_MUX[lut][i] == port)
|
|
return i;
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
struct fpga_cell *fpga_cell_lut34_new()
|
|
{
|
|
struct fpga_cell_lut34 *fpga_cell_lut_34;
|
|
|
|
fpga_cell_lut_34 = malloc(sizeof(struct fpga_cell_lut34));
|
|
|
|
return FPGA_TO_CELL(fpga_cell_lut_34);
|
|
}
|
|
|
|
struct fpga_cell *fpga_cell_lut34_get_next_isp(struct fpga_cell *cell,
|
|
enum fpga_isp_channel *isp_channel)
|
|
{
|
|
switch (*isp_channel) {
|
|
case FPGA_ISP_CHANNEL_LFDN:
|
|
*isp_channel = FPGA_ISP_CHANNEL_NORMAL;
|
|
return cell->cell_connections[BOTTOM];
|
|
case FPGA_ISP_CHANNEL_NORMAL:
|
|
return cell->cell_connections[RIGHT];
|
|
case FPGA_ISP_CHANNEL_BACK:
|
|
return cell->cell_connections[LEFT];
|
|
default:
|
|
report(LL_ERROR,
|
|
"Unhandled ISP channel %d for LUT34.",
|
|
*isp_channel);
|
|
}
|
|
return NULL;
|
|
|
|
}
|
|
|
|
char *fpga_cell_lut34_isp_generate_bitstream(struct fpga_cell *cell)
|
|
{
|
|
struct fpga_cell_lut34 *lut34 = (struct fpga_cell_lut34 *) cell;
|
|
char *buf = NULL;
|
|
char *sbuf = NULL;
|
|
int i;
|
|
int temp;
|
|
|
|
buf = calloc(cell->type->isp_length, sizeof(char));
|
|
sbuf = calloc(cell->type->isp_length, sizeof(char));
|
|
|
|
if (!buf) {
|
|
report(LL_CRITICAL,
|
|
"Out of memory during bitstream generation.");
|
|
errno = ENOMEM;
|
|
goto fail;
|
|
}
|
|
|
|
for (i = 0; i < 4; ++i) {
|
|
temp = fpga_cell_lut34_lut_get_mux(i, lut34->lut_in_sel[i]);
|
|
|
|
if (temp < 0) {
|
|
report(LL_ERROR,
|
|
"Invalid input mux '%c' selected for mux %d on cell %p.",
|
|
lut34->lut_in_sel[i], i, cell);
|
|
errno = EINVAL;
|
|
goto fail;
|
|
}
|
|
|
|
}
|
|
|
|
return buf;
|
|
|
|
fail:
|
|
if (buf)
|
|
free(buf);
|
|
if (sbuf)
|
|
free(sbuf);
|
|
return NULL;
|
|
}
|