コード例 #1
0
ファイル: ssDDM.c プロジェクト: q3k/ski
BOOL templAssign(unsigned argc, char *argv[])
{
    ADDR adr, tadr;
    REG val, tval;
    Bundle bndl;
    BYTE templ;
    REG datamask = ONES(5);
    unsigned i;
    BOOL ret = YES;

    if (!evalExpr(argv[0], HEXEXP, &adr))
	return NO;
    if (adr != (tadr = adr & ~(ADDR)0xf)) {
	adr = tadr;
	cmdWarn("Non bundle-aligned address.  Aligned to 0x%llx\n", adr);
    }

    for (i = 1; i < argc; i++, adr += 16) {
	if (asm_templ(argv[i], &templ) == AsmOK)
	    val = templ;
	else if (!evalExpr(argv[i], HEXEXP, &val))
	    continue;
	if (val != (tval = val & datamask)) {
	    val = tval;
	    cmdWarn("Data larger than 0x1f.  Truncated to 0x%llx\n", val);
	}
	templ = (BYTE)val;
	if (!memMIRd(adr, (DWORD *)&bndl)) {
	    cmdWarn("Assignment failed\n");
	    continue;
	}
	templReplace(&bndl, adr, templ);
	(void)memMIWrt(adr, (DWORD *)&bndl);
    }
    if (i != argc) {
	cmdErr("Some values could not be assigned\n");
	ret = NO;
    }
    prgwUpdate();
    datwUpdate();
    return ret;
}
コード例 #2
0
ファイル: ssDDM.c プロジェクト: q3k/ski
/*---------------------------------------------------------------------------
 * memory$Assign - Assign specified data items of specified 'size' to memory
 *  starting with the given address.
 *---------------------------------------------------------------------------*/
static BOOL memAssign(unsigned argc, char *argv[], unsigned size)
{
    ADDR adr, tadr;
    REG val, tval;
    REG adrmask  = size - 1;
    REG datamask = ONES(size*8);
    unsigned i;
    BOOL ret = YES;
    static const char sizestr[][12] = {
	"0 ?", "byte", "halfword",
	"3 ?", "word", "5 ?",
	"6 ?", "7 ?", "doubleword"
    };

    if (!evalExpr(argv[0], HEXEXP, &adr))
	return NO;
    if (adr != (tadr = adr & ~adrmask)) {
	adr = tadr;
	cmdWarn("Non %s-aligned address.  Aligned to 0x%llx\n",
		sizestr[size], adr);
    }

    for (i = 1; i < argc; i++, adr += size) {
	if (!evalExpr(argv[i], HEXEXP, &val))
	    break;
	if (val != (tval = val & datamask)) {
	    val = tval;
	    cmdWarn("Data larger than %d byte%s.  Truncated to 0x%llx\n",
		    size, size > 1 ? "s" : "", val);
	}
	if (!memMWrt(adr, size, val))
	    cmdWarn("Assignment to address %llx failed\n", adr);
    }
    if (i != argc) {
	cmdErr("Some values could not be assigned\n");
	ret = NO;
    }
    prgwUpdate();
    datwUpdate();
    return ret;
}
コード例 #3
0
ファイル: sr.cpp プロジェクト: filippobistaffa/SR-CFSS
void scalefree(edge *g, agent *a) {

	edge ne = 1;
	agent deg[N] = {0};

	for (agent i = 1; i <= M; i++) {
		for (agent j = 0; j < i; j++) {
			createedge(g, a, i, j, ne);
			deg[i]++;
			deg[j]++;
			ne++;
		}
	}

	chunk t[C] = { 0 }, t1[C] = { 0 };

	for (agent i = M + 1; i < N; i++) {
		ONES(t1, i, C);
		MASKANDNOT(t, t1, t, C);
		for (agent j = 0; j < M; j++) {
			agent d = 0;
			for (agent h = 0; h < i; h++)
				if (!GET(t, h)) d += deg[h];
			if (d > 0) {
				int p = nextInt(d);
				agent q = 0;
				while (p >= 0) {
					if (!GET(t, q)) p = p - deg[q];
					q++;
				}
				q--;
				SET(t, q);
				createedge(g, a, i, q, ne);
				deg[i]++;
				deg[q]++;
				ne++;
			}
		}
	}
}
コード例 #4
0
ファイル: ssDDM.c プロジェクト: q3k/ski
BOOL instrAssign(unsigned argc, char *argv[])
{
    ADDR adr, tadr;
    REG val, tval;
    REG datamask = ONES(41);
    unsigned i, slot;
    BOOL ret = YES;
    Bundle bndl;
    InstID instID;
    Operands ops;
    EncodedInst inst;

    if (!evalExpr(argv[0], HEXEXP, &adr))
	return NO;
    if ((slot = SLOT(adr)) > 2) {
	cmdErr("Illegal slot field in instruction address\n");
	return NO;
    }
    if (adr != (tadr = adr & ~(ADDR)0x3)) {
	adr = tadr;
	cmdWarn("Non slot-aligned address.  Aligned to 0x%llx\n", adr);
    }
    badr = adr & ~(ADDR)0xf;	/* bundle-align address */

    for (i = 1; i < argc; i++, slot++) {
	if (slot >= SLOTS_PER_BUNDLE) {
	    slot = 0;
	    badr += 16;
	}
	if (asm_inst(argv[i], &instID, &ops, &inst) != AsmOK) {
	    if (evalExpr(argv[i], HEXEXP, &val)) {
		if (val != (tval = val & datamask)) {
		    val = tval;
		    cmdWarn("Data larger than 41 bits.  Truncated to 0x%llx\n",
			    val);
		}
		inst.bits = val;
		inst.unit = No_Unit;
		inst.valid_extra_bits = 0;
	    } else
		break;
    }
	if (!memMIRd(badr, (DWORD *)&bndl)) {
	    cmdWarn("Assignment failed\n");
	    continue;
	}
	if (!instrReplace(&bndl, badr, slot, &inst)) {
	    cmdWarn("That instruction not allowed in that slot\n");
	    continue;
	}
	(void)memMIWrt(badr, (DWORD *)&bndl);
	if (inst.valid_extra_bits)
	    slot++;
    }
    if (i != argc) {
	cmdErr("Some values could not be assigned\n");
	ret = NO;
    }
    prgwUpdate();
    datwUpdate();
    return ret;
}
コード例 #5
0
ファイル: ssDDM.c プロジェクト: q3k/ski
/*---------------------------------------------------------------------------
 * value$Assign - Assign the user specified value to the user-specifed
 *  internal symbol.
 *---------------------------------------------------------------------------*/
BOOL valAssign(unsigned argc, char *argv[])
{
    struct isym *psym, sym;
    REG val;

    if (!(psym = isymVLkp(argv[0]))) {
	cmdErr("Unrecognized symbol name: %s\n", argv[0]);
	return NO;
    }
    sym = *psym;
    if (!evalExpr(argv[1], psym->dbase, &val))
	return NO;

    switch (sym.type) {
	case SINGLE_SYM:
	    if (sym.setFn) {
		if (!sym.setFn(0, val)) {
		    cmdErr("Attempt to modify symbol failed\n");
		    return NO;
		}
	    } else {
		cmdWarn("Ignored attempt to write a Read-Only symbol\n");
		return NO;
	    }
	    break;
	case REGSET_SYM:
	    if (sym.setFn) {
		if (!sym.setFn(0, sym.ndx, val)) {
		    cmdErr("Attempt to modify symbol failed\n");
		    return NO;
		}
	    } else {
		cmdWarn("Ignored attempt to write a Read-Only symbol\n");
		return NO;
	    }
	    break;
	case BITF_SYM:
	    if (sym.setFn) {
		REG oldval = sym.getFn(0), mask;

		mask = ONES(sym.len) << (sym.start - (sym.len - 1));
		val <<= sym.start - (sym.len - 1);
		val = (oldval & ~mask) | (val & mask);
		if (!sym.setFn(0, val)) {
		    cmdErr("Attempt to modify symbol failed\n");
		    return NO;
		}
	    } else {
		cmdWarn("Ignored attempt to write a Read-Only symbol\n");
		return NO;
	    }
	    break;
	case RS_BITF_SYM:
	    if (sym.setFn) {
		REG oldval = sym.getFn(0, sym.ndx), mask;

		mask = ONES(sym.len) << (sym.start - (sym.len - 1));
		val <<= sym.start - (sym.len - 1);
		val = (oldval & ~mask) | (val & mask);
		if (!sym.setFn(0, sym.ndx, val)) {
		    cmdErr("Attempt to modify symbol failed\n");
		    return NO;
		}
	    } else {
		cmdWarn("Ignored attempt to write a Read-Only symbol\n");
		return NO;
	    }
	    break;
	default:
	    break;
    }
    setDerivedState(1);
    prgwPCRedraw();
    datwUpdate();
    regwUpdate();
    return YES;
}
コード例 #6
0
	 0xffffffff,		/* Source mask.  */
	 0xffffffff,		/* Dest mask.  */
	 FALSE),		/* PCrel_offset.  */

  /* A 64 bit reference to a symbol.  */
  HOWTO (ALPHA_R_REFQUAD,	/* Type.  */
	 0,			/* Rightshift.  */
	 4,			/* Size (0 = byte, 1 = short, 2 = long).  */
	 64,			/* Bitsize.  */
	 FALSE,			/* PC_relative.  */
	 0,			/* Bitpos.  */
	 complain_overflow_bitfield, /* Complain_on_overflow.  */
	 0,			/* Special_function.  */
	 "REFQUAD",		/* Name.  */
	 TRUE,			/* Partial_inplace.  */
	 ONES (64),		/* Source mask.  */
	 ONES (64),		/* Dest mask.  */
	 FALSE),		/* PCrel_offset.  */

  /* A 32 bit GP relative offset.  This is just like REFLONG except
     that when the value is used the value of the gp register will be
     added in.  */
  HOWTO (ALPHA_R_GPREL32,	/* Type.  */
	 0,			/* Rightshift.  */
	 2,			/* Size (0 = byte, 1 = short, 2 = long).  */
	 32,			/* Bitsize.  */
	 FALSE,			/* PC_relative.  */
	 0,			/* Bitpos.  */
	 complain_overflow_bitfield, /* Complain_on_overflow.  */
	 0,			/* Special_function.  */
	 "GPREL32",		/* Name.  */
コード例 #7
0
ファイル: sr.cpp プロジェクト: filippobistaffa/SR-CFSS
int main(int argc, char *argv[]) {

	// Allocate stack

	stack st[N];

	// Create shortest paths matrix

	const unsigned seed = atoi(argv[1]);
	st->sp = createsp(seed);

	// Generate random set of drivers

	for (agent i = 0; i < D; i++)
		st->dr[i] = 1;

	memset(st->dr + D, 0, sizeof(agent) * (N - D));
	shuffle(st->dr, N, sizeof(agent));
	memcpy(drg, st->dr, N * sizeof(agent));

	// Initialise n, s, and cs data structures

	st->n[N] = N;

	for (agent i = 0; i < N; i++) {
		X(sg, i) = X(st->s, i) = 1;
		Y(sg, i) = Y(st->s, i) = csg[i] = st->cs[i] = i;
		st->l[i] = st->sp[4 * i * N + 2 * i + 1];
		min += COST(i, st->dr, st->l);
		st->n[st->n[i] = N + i + 1] = i;
	}

	// Initialise c and r bitmasks

	ONES(st->c, E + 1, C);
	CLEAR(st->c, 0);
	ONES(st->r, E + 1, C);
	CLEAR(st->r, 0);

	// Create graph

	#ifdef M
	init(seed);
	memset(st->g, 0, sizeof(edge) * N * N);
	scalefree(st->g, st->a);
	#else
	FILE *f = fopen(argv[2], "r");
	for (agent e = 1; e <= E; e++) {
		agent v1, v2;
		fscanf(f, "%u %u", &v1, &v2);
		createedge(st->g, st->a, v1, v2, e);
	}
	fclose(f);
	#endif

	// Reorder (eventually)

	#ifdef REORDER
	edge go[N * N] = {0};
	agent ao[2 * (E + 1)];
	#ifdef METIS
	idx_t options[METIS_NOPTIONS];
	METIS_SetDefaultOptions(options);
	options[METIS_OPTION_OBJTYPE] = METIS_OBJTYPE_CUT;
	options[METIS_OPTION_SEED] = seed;
	real_t tpwgts[2] = {0.5, 0.5}, ubvec = TOLERANCE;
	agent map[N];
	edge e = 1;
	for (agent i = 0; i < N; i++) map[i] = i;
	reorderedges(st->g, map, N, E, go, ao, &e, tpwgts, &ubvec, options);
	#else
	driversbfs(st->a, st->dr, go, ao);
	#endif
	memcpy(st->g, go, sizeof(edge) * N * N);
	memcpy(st->a, ao, sizeof(agent) * 2 * (E + 1));
	#endif

	#ifdef TREEDOT
	st->dot = fopen(TREEDOT, "w+");
	fprintf(st->dot, "digraph TREE {\n");
	fprintf(st->dot, "\tnode [color = none; shape = plaintext, width = 0.2, height = 0.2];\n");
	#endif

	// Solve

	sol = *st;
	#ifdef LIMIT
	value bou = bound(st);
	#endif
	gettimeofday(&t1, NULL);
	srcfss(st, min);
	gettimeofday(&t2, NULL);

	// Print solution

	#ifdef TREEDOT
	printf("SOLUTION = %zu\n", sol.id);
	fprintf(st->dot, "\t%zu [shape = circle, style = filled, fillcolor = green];\n", sol.id);
	#endif

	#ifdef PK
	FILE *pk = fopen(PK, "w+");
	fprintf(pk, "%u\n%u\n%u\n", N, K, seed);
	printg(st->g, pk);
	printpk(&sol, pk);
	fclose(pk);
	#endif

	#ifdef CSV
	printf("%u,%u,%s,%.2f,%f,%zu\n", N, E, argv[1], 0.01 * min, 
	       (double)(t2.tv_usec - t1.tv_usec) / 1e6 + t2.tv_sec - t1.tv_sec, count);
	#else
	printcs(&sol);
	printf("Visited nodes = %zu\n", count);
	printf("Elapsed time = %f\n", (double)(t2.tv_usec - t1.tv_usec) / 1e6 + t2.tv_sec - t1.tv_sec);
	printf("Solution = %.2f€\n", 0.01 * min);
	#ifdef LIMIT
	printf("Bound = %.2f€\n", 0.01 * bou);
	#endif
	#endif

	// Free data structures

	#ifdef TREEDOT
	fprintf(st->dot, "}");
	fclose(st->dot);
	#endif
	free(st->sp);

	return 0;
}