change queues, run exec speed optimizations

This commit is contained in:
2026-06-23 21:30:01 +03:00
parent 7a272788f8
commit 26e594cee6
22 changed files with 919 additions and 613 deletions

View File

@@ -27,13 +27,12 @@ void freeDevMem(device_mem_t* devMem)
{
free(devMem->memsegShifts);
free(devMem->memsegSizes);
free(devMem->memsegCellSizes);
free(devMem->rawCells);
free(devMem->memreadCellAddrs);
free(devMem->memwriteCellAddrs);
free(devMem->memwriteCellSegments);
free(devMem->memwriteValues[0]);
free(devMem->memwriteValues);
free(devMem->memwriteWordLengths);
free(devMem->cells);
free(devMem->smartAddrReadHandlers);
free(devMem->smartAddrWriteHandlers);
@@ -118,10 +117,6 @@ device_mem_t* genDevMem(device_specs_t* devSpec, char* errbuf)
return NULL;
}
for(size_t i = 0; i < devSpec->memSpecsCount; i++)
{
// cellNames[i] = devSpec->memSpecs[i]->name;
}
for (uint8_t i = 0; i < devSpec->memSpecsCount; i++)
{
@@ -170,8 +165,7 @@ device_mem_t* genDevMem(device_specs_t* devSpec, char* errbuf)
return NULL;
}
void** memwriteValues = calloc(MEM_ACCESS_INTERCEPT_BUF_SIZE, sizeof(void*));
uint64_t* memwriteValues = calloc(MEM_ACCESS_INTERCEPT_BUF_SIZE, sizeof(uint64_t));
if(memwriteValues == NULL)
{
sprintf(errbuf, "unable to allocate write interception addrs");
@@ -186,43 +180,6 @@ device_mem_t* genDevMem(device_specs_t* devSpec, char* errbuf)
return NULL;
}
uint64_t* memwriteValuesContainers = calloc(MEM_ACCESS_INTERCEPT_BUF_SIZE, sizeof(uint64_t));
if(memwriteValuesContainers == NULL)
{
sprintf(errbuf, "unable to allocate write interception addrs");
free(devMem->memsegShifts);
free(devMem);
free(rawCells);
free(memreadCellAddrs);
free(cells);
free(cellNames);
free(memwriteCellAddrs);
free(memwriteCellSegments);
free(memwriteValues);
return NULL;
}
for(size_t i = 0; i < 64; i++)
{
memwriteValues[i] = &memwriteValuesContainers[i];
}
uint8_t* memwriteWordLengths = calloc(MEM_ACCESS_INTERCEPT_BUF_SIZE, sizeof(uint8_t));
if(memwriteWordLengths == NULL)
{
sprintf(errbuf, "unable to allocate write interception addrs");
free(devMem->memsegShifts);
free(devMem);
free(rawCells);
free(memreadCellAddrs);
free(cells);
free(cellNames);
free(memwriteCellAddrs);
free(memwriteCellSegments);
free(memwriteValues);
free(memwriteValuesContainers);
return NULL;
}
uint64_t smartAddrReadMask = 0;
uint64_t smartAddrWriteMask = 0;
@@ -240,8 +197,6 @@ device_mem_t* genDevMem(device_specs_t* devSpec, char* errbuf)
free(memwriteCellAddrs);
free(memwriteCellSegments);
free(memwriteValues);
free(memwriteValuesContainers);
free(memwriteWordLengths);
return NULL;
}
@@ -259,8 +214,6 @@ device_mem_t* genDevMem(device_specs_t* devSpec, char* errbuf)
free(memwriteCellAddrs);
free(memwriteCellSegments);
free(memwriteValues);
free(memwriteValuesContainers);
free(memwriteWordLengths);
free(cells);
free(cellNames);
return NULL;
@@ -270,7 +223,26 @@ device_mem_t* genDevMem(device_specs_t* devSpec, char* errbuf)
if(memsegSizes == NULL)
{
sprintf(errbuf, "unable to allocate write interception handlers");
sprintf(errbuf, "unable to allocate memseg sizes");
free(smartAddrWriteHandlers);
free(smartAddrReadHandlers);
free(devMem->memsegShifts);
free(devMem);
free(rawCells);
free(memreadCellAddrs);
free(memwriteCellAddrs);
free(memwriteCellSegments);
free(memwriteValues);
free(cells);
free(cellNames);
return NULL;
}
uint8_t* memsegCellSizes = calloc(devSpec->memSpecsCount, sizeof(uint8_t));
if(memsegCellSizes == NULL)
{
sprintf(errbuf, "unable to allocate memseg cell sizes");
free(memsegSizes);
free(smartAddrWriteHandlers);
free(smartAddrReadHandlers);
free(devMem->memsegShifts);
@@ -280,31 +252,29 @@ device_mem_t* genDevMem(device_specs_t* devSpec, char* errbuf)
free(memwriteCellAddrs);
free(memwriteCellSegments);
free(memwriteValues);
free(memwriteValuesContainers);
free(memwriteWordLengths);
free(cells);
free(cellNames);
return NULL;
}
for(uint64_t i = 0; i < memTotalSize; i++)
{
smartAddrReadHandlers[i].func = NULL;
smartAddrReadHandlers[i].ident = 0;
// for(uint64_t i = 0; i < memTotalSize; i++)
// {
// smartAddrReadHandlers[i].func = NULL;
// smartAddrReadHandlers[i].ident = 0;
smartAddrWriteHandlers[i].func = NULL;
smartAddrWriteHandlers[i].ident = 0;
}
// smartAddrWriteHandlers[i].func = NULL;
// smartAddrWriteHandlers[i].ident = 0;
// }
for(uint64_t i = 0; i < memTotalSize; i++)
{
if((i & smartAddrReadMask) == smartAddrReadMask)
{
smartAddrReadHandlers[i].func = NULL;
}
}
// for(uint64_t i = 0; i < memTotalSize; i++)
// {
// if((i & smartAddrReadMask) == smartAddrReadMask)
// {
// smartAddrReadHandlers[i].func = NULL;
// }
// }
if (devSpec->smartReadSpecsCount > 0)
@@ -355,7 +325,6 @@ device_mem_t* genDevMem(device_specs_t* devSpec, char* errbuf)
devMem->memreadCellAddrs = memreadCellAddrs;
devMem->memwriteCellAddrs = memwriteCellAddrs;
devMem->memwriteCellSegments = memwriteCellSegments;
devMem->memwriteWordLengths = memwriteWordLengths;
devMem->memwriteValues = memwriteValues;
devMem->memreadLen = 0;
devMem->memwriteLen = 0;
@@ -365,6 +334,7 @@ device_mem_t* genDevMem(device_specs_t* devSpec, char* errbuf)
devMem->smartAddrWriteHandlers = smartAddrWriteHandlers;
devMem->memsegNames = cellNames;
devMem->memsegSizes = memsegSizes;
devMem->memsegCellSizes = memsegCellSizes;
memseg_metadata_t requiredSegments[] = MEMSEG_DEFINES;
@@ -380,7 +350,8 @@ device_mem_t* genDevMem(device_specs_t* devSpec, char* errbuf)
const uint8_t seg_id = seg_def.seg_id;
devMem->memsegShifts[seg_id] = memSegToGlobal(devSpec, i, 0);
devMem->memsegSizes[seg_id] = devSpec->memSpecs[i]->len;
printf("set mem segment %d meta: +%lu/%lu \n", seg_id, devMem->memsegShifts[j], devMem->memsegSizes[j]);
devMem->memsegCellSizes[seg_id] = devSpec->memSpecs[i]->wordLen;
printf("set mem segment %d meta: +%lu/%lu[%d] \n", seg_id, devMem->memsegShifts[seg_id], devMem->memsegSizes[seg_id], devMem->memsegCellSizes[seg_id]);
}
}
}
@@ -404,6 +375,10 @@ uint8_t makeDeviceTick(device_public_context_t* devContext)
prog_counter_t _pc;
READ_MEM(_pc, devInfo->deviceMem, MEMSEG_PC_SEG_NUM, MEMSEG_PC_ADDR, prog_counter_t)
// printf("old PC is %d\n", _pc);
if(_pc >= devInfo->deviceMem->memsegSizes[MEMSEG_PS])
{
_pc = 0;
}
uint8_t ticks = makeTick(&_pc, devInfo->instr, devInfo->deviceMem);
WRITE_MEM(devInfo->deviceMem, MEMSEG_PC_SEG_NUM, MEMSEG_PC_ADDR, prog_counter_t, _pc);
// printf("new PC is %d\n", _pc);
@@ -593,7 +568,7 @@ device_specs_t* parseSpecsFromConfig(const conf_dev_t* devConf, char* errbuf)
free(requiredSegmentsFoundMap);
return NULL;
}
specs->memSpecs[specNum]->name = calloc(strlen(segments[i]->name), sizeof(char));
specs->memSpecs[specNum]->name = calloc(strlen(segments[i]->name) + 1, sizeof(char));
if(specs->memSpecs[specNum]->name == NULL)
{
sprintf(errbuf, "unable to allocate spec %d name", i);
@@ -837,6 +812,8 @@ uint8_t pubExtractPcounterSizeWords()
void reset (device_specs_t* specs, device_public_context_t* devInfo)
{
// printf("reset device\n");
// uint8_t fuck = 0;
for(size_t i = 0; i < specs->memSpecsCount; i++)
{
if(i != MEMDATA_OPSIZE)
@@ -845,10 +822,12 @@ void reset (device_specs_t* specs, device_public_context_t* devInfo)
for(size_t j = 0; j < spec->len; j++)
{
((uint8_t*)devInfo->deviceMem->cells[i])[j] = 0;
// fuck++;
}
}
}
devInfo->deviceMem->memwriteLen = 0;
devInfo->deviceMem->memreadLen = 0;
}
}