57 lines
1.2 KiB
C
57 lines
1.2 KiB
C
#include "fpga.h"
|
|
#include "fpga_global.h"
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
|
|
int fpga_generate_bitstream(struct fpga_chain *chain,
|
|
char *filename, int ascii)
|
|
{
|
|
int i;
|
|
char *buf = NULL;
|
|
FILE *bitstream = stdout;
|
|
|
|
if (strcmp(filename, "-")) {
|
|
bitstream = fopen(filename, "wb");
|
|
}
|
|
if (!bitstream) {
|
|
report(LL_ERROR,
|
|
"Could not open output file '%s'.",
|
|
filename);
|
|
errno = EIO;
|
|
goto fail;
|
|
}
|
|
|
|
report(LL_INFO, "Generating bitstream...");
|
|
|
|
for (i = chain->length - 1; i >= 0; --i) {
|
|
report(LL_DEBUG,
|
|
"Generating bitstream for cell %p (%c)...",
|
|
chain->head[i], chain->head[i]->type->identifier);
|
|
buf = chain->head[i]->type->isp_generate_bitstream(chain->head[i]);
|
|
if (!buf) {
|
|
report(LL_ERROR,
|
|
"Error during bitstream generation for cell %p.",
|
|
chain->head[i]);
|
|
errno = ETYPE;
|
|
goto fail;
|
|
}
|
|
for (int j = 0; j < chain->head[i]->type->isp_length; ++j) {
|
|
if (ascii)
|
|
fprintf(bitstream, "%02X ", buf[j] & 0xFF);
|
|
else
|
|
fputc(buf[j] & 0xFF, bitstream);
|
|
}
|
|
if (ascii)
|
|
fprintf(bitstream, "\n");
|
|
free(buf);
|
|
}
|
|
|
|
return 0;
|
|
|
|
fail:
|
|
if (bitstream && (strcmp(filename, "-")))
|
|
fclose(bitstream);
|
|
return 1;
|
|
}
|