#include "fpga_cell_lut34.h" #include "fpga_global.h" #include #include /* 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; }