blob: dedb6f2fc678c4febc35f66af865658fd15eb186 [file] [log] [blame]
// SPDX-License-Identifier: GPL-2.0+
/* vim: set ts=8 sw=8 noet tw=80 nowrap: */
#include <stdint.h>
#include <stdbool.h>
#include <stddef.h>
#include <errno.h>
#include <stdlib.h>
typedef uint8_t u8;
typedef uint16_t u16;
typedef int8_t s8;
#define __user
#define BIT(x) (1UL << (x))
#define NI_ROUTE_VALUE_EXTERNAL_CONVERSION 1
#include "../ni_route_values.c"
#include "../ni_device_routes.c"
#include "all_cfiles.c"
#include <stdio.h>
#define RVij(rv, src, dest) ((rv)->register_values[(dest)][(src)])
/*
* write out
* {
* "family" : "<family-name>",
* "register_values": {
* <destination0>:[src0, src1, ...],
* <destination0>:[src0, src1, ...],
* ...
* }
* }
*/
void family_write(const struct family_route_values *rv, FILE *fp)
{
fprintf(fp,
" \"%s\" : {\n"
" # dest -> {src0:val0, src1:val1, ...}\n"
, rv->family);
for (unsigned int dest = NI_NAMES_BASE;
dest < (NI_NAMES_BASE + NI_NUM_NAMES);
++dest) {
unsigned int src = NI_NAMES_BASE;
for (; src < (NI_NAMES_BASE + NI_NUM_NAMES) &&
RVij(rv, B(src), B(dest)) == 0; ++src)
;
if (src >= (NI_NAMES_BASE + NI_NUM_NAMES))
continue; /* no data here */
fprintf(fp, " %u : {\n", dest);
for (src = NI_NAMES_BASE; src < (NI_NAMES_BASE + NI_NUM_NAMES);
++src) {
register_type r = RVij(rv, B(src), B(dest));
const char *M;
if (r == 0) {
continue;
} else if (MARKED_V(r)) {
M = "V";
} else if (MARKED_I(r)) {
M = "I";
} else if (MARKED_U(r)) {
M = "U";
} else {
fprintf(stderr,
"Invalid register marking %s[%u][%u] = %u\n",
rv->family, dest, src, r);
exit(1);
}
fprintf(fp, " %u : \"%s(%u)\",\n",
src, M, UNMARK(r));
}
fprintf(fp, " },\n");
}
fprintf(fp, " },\n\n");
}
bool is_valid_ni_sig(unsigned int sig)
{
return (sig >= NI_NAMES_BASE) && (sig < (NI_NAMES_BASE + NI_NUM_NAMES));
}
/*
* write out
* {
* "family" : "<family-name>",
* "register_values": {
* <destination0>:[src0, src1, ...],
* <destination0>:[src0, src1, ...],
* ...
* }
* }
*/
void device_write(const struct ni_device_routes *dR, FILE *fp)
{
fprintf(fp,
" \"%s\" : {\n"
" # dest -> [src0, src1, ...]\n"
, dR->device);
unsigned int i = 0;
while (dR->routes[i].dest != 0) {
if (!is_valid_ni_sig(dR->routes[i].dest)) {
fprintf(stderr,
"Invalid NI signal value [%u] for destination %s.[%u]\n",
dR->routes[i].dest, dR->device, i);
exit(1);
}
fprintf(fp, " %u : [", dR->routes[i].dest);
unsigned int j = 0;
while (dR->routes[i].src[j] != 0) {
if (!is_valid_ni_sig(dR->routes[i].src[j])) {
fprintf(stderr,
"Invalid NI signal value [%u] for source %s.[%u].[%u]\n",
dR->routes[i].src[j], dR->device, i, j);
exit(1);
}
fprintf(fp, "%u,", dR->routes[i].src[j]);
++j;
}
fprintf(fp, "],\n");
++i;
}
fprintf(fp, " },\n\n");
}
int main(void)
{
FILE *fp = fopen("ni_values.py", "w");
/* write route register values */
fprintf(fp, "ni_route_values = {\n");
for (int i = 0; ni_all_route_values[i]; ++i)
family_write(ni_all_route_values[i], fp);
fprintf(fp, "}\n\n");
/* write valid device routes */
fprintf(fp, "ni_device_routes = {\n");
for (int i = 0; ni_device_routes_list[i]; ++i)
device_write(ni_device_routes_list[i], fp);
fprintf(fp, "}\n");
/* finish; close file */
fclose(fp);
return 0;
}