Esempio n. 1
0
static void
write_firmware(const char *filename,
               const struct ia_css_blob_info *blob_original)
{
    FILE *binary;
    const char name[] = STR(APPL);

    binary = fopen(filename, "wb");

    if (!binary) {
        fprintf(stderr, "Cannot open firmware file %s\n", filename);
        exit(1);
    }
    if (verbose) {
        fprintf(stdout, "FW name : %s\n\n", name);
    }

    fwrite(&firmware_header, 1, sizeof(firmware_header), binary);
    if (mem_offsets)
        fwrite(mem_offsets, 1, mem_offsets_size, binary);
    if (conf_mem_offsets)
        fwrite(conf_mem_offsets, 1, conf_mem_offsets_size, binary);
    if (state_mem_offsets)
        fwrite(state_mem_offsets, 1, state_mem_offsets_size, binary);
    fwrite(name, 1, strlen(name) + 1, binary);
    if (blob != NULL) {
        struct ia_css_blob_info	*blob_aligned = &(firmware_header.blob);
        size_t size = 0;

        if (firmware_header.blob.padding_size == 0) {
            /* MW: This path is redundant */
            size += fwrite(blob, 1, firmware_header.blob.size,
                           binary);
        } else {
            /* Again assume a fixed order of sections */
            /* Fill to an aligned boundary */
            size += ffill(blob_aligned->icache_padding, binary);
            size += fwrite(blob + blob_original->icache_source,
                           1, blob_original->icache_size, binary);

            size += ffill(blob_aligned->text_padding, binary);
            size += fwrite(blob + blob_original->text_source,
                           1, blob_original->text_size, binary);

            size += ffill(blob_aligned->data_padding, binary);
            size += fwrite(blob + blob_original->data_source,
                           1, blob_original->data_size, binary);
        }
        assert(blob_aligned->size == size);
    }

    fclose(binary);
}
Esempio n. 2
0
/*
 * Calculate conditional probability distribution given probability function
 * and conditioning distributions.
 *
 * RUNNING TIME: mul = O(dist->len*SIGMA(dist[i]->len))
 *
 * @param func
 *				probability function
 * @param dist
 *				array of probability distributions
 * @param cond
 *				target probability distribution
 * @return
 *				0 on success, or error code
 */
int cbayes_conditional(pfunc *func, pdist **dist, pdist *cond)
{
	// cache pointers, precompute
	int i, j, b;
	int clen = func->condlen;
	int nvars = func->nvars;
	int nvn1 = nvars - 1;
	int *idx = func->idx;
	int *len = func->len;
	double *val = func->val;
	double *fdist = func->dist;
	double **cdist = func->cdist;
	double *tdist = cond->dist;
	for (i=0; i<func->nvars; i++)
		cdist[i] = dist[i]->dist;

	// initialize to zeros
	ifill(idx, nvars, 0);
	ffill(tdist, clen, 0.0);
	
	// loop every conditional combination
	for (i=0; i<clen; i++)
	{
		// increment recursive index
		j = nvn1;
		while (j >= 0 && (++idx[j] == len[j+1]))
			idx[j--] = 0;
		// multiple conditional probabilities together
		for (; j<nvars; j++)
			val[j+1] = val[j] * cdist[j][idx[j]];
		// multiply by function into target
		for (j=0, b=i; j<len[0]; j++, b+=cond->len)
			tdist[j] += cdist[b] * val[nvars];
	}

	// correct within normal tolerance
	correct(cond->dist, cond->len); 

	return 0;
}