in src/runtime/crt/graph_executor/graph_executor.c [228:521]
int TVMGraphExecutorGraphAttr_Load(TVMGraphExecutorGraphAttr* attr, JSONReader* reader) {
int status = 0;
int bitmask = 0;
char key[16], type[16];
uint32_t storage_id_count = 0;
uint32_t dltype_count = 0;
uint32_t shape_count = 0;
uint32_t device_index_count = 0;
reader->BeginObject(reader);
while (reader->NextObjectItem(reader, key, sizeof(key))) {
if (!strcmp(key, "dltype")) {
reader->BeginArray(reader);
if (!(reader->NextArrayItem(reader))) {
fprintf(stderr, "Invalid json format\n");
status = -1;
break;
}
status = reader->ReadString(reader, type, sizeof(type));
if (status != 0) {
fprintf(stderr, "error reading dltype type\n");
break;
}
if (strcmp(type, "list_str")) {
fprintf(stderr, "Invalid json format\n");
status = -1;
break;
}
if (!(reader->NextArrayItem(reader))) {
fprintf(stderr, "Invalid json format\n");
status = -1;
break;
}
reader->BeginArray(reader);
size_t num_items = 0;
if (reader->ArrayLength(reader, &num_items) != 0) {
fprintf(stderr, "error determing list_str length\n");
status = -1;
break;
}
DLDevice dev = {kDLCPU, 0};
tvm_crt_error_t err =
TVMPlatformMemoryAllocate(TVM_CRT_STRLEN_DLTYPE * num_items, dev, (void**)&attr->dltype);
if (err != kTvmErrorNoError) {
fprintf(stderr, "memory allocate error: %08x", err);
return -1;
}
dltype_count = 0;
while (reader->NextArrayItem(reader)) {
if (dltype_count == num_items) {
fprintf(stderr, "array too big\n");
status = -1;
return status;
}
status = reader->ReadString(reader, attr->dltype + dltype_count * TVM_CRT_STRLEN_DLTYPE,
TVM_CRT_STRLEN_DLTYPE);
if (status != 0) {
fprintf(stderr, "error reading dltype array item");
break;
}
dltype_count++;
}
attr->dltype_count = dltype_count;
if (reader->NextArrayItem(reader)) {
fprintf(stderr, "Invalid json format\n");
status = -1;
break;
}
bitmask |= 1;
} else if (!strcmp(key, "storage_id")) {
reader->BeginArray(reader);
if (!(reader->NextArrayItem(reader))) {
fprintf(stderr, "Invalid json format\n");
status = -1;
break;
}
status = reader->ReadString(reader, type, sizeof(type));
if (status != 0) {
fprintf(stderr, "error reading device_index array item");
}
if (strcmp(type, "list_int")) {
fprintf(stderr, "Invalid json format\n");
status = -1;
break;
}
if (!(reader->NextArrayItem(reader))) {
fprintf(stderr, "Invalid json format\n");
status = -1;
break;
}
reader->BeginArray(reader);
size_t num_items = 0;
if (reader->ArrayLength(reader, &num_items) != 0) {
fprintf(stderr, "error determing list_str length\n");
status = -1;
break;
}
DLDevice dev = {kDLCPU, 0};
tvm_crt_error_t err =
TVMPlatformMemoryAllocate(sizeof(uint32_t) * num_items, dev, (void**)&attr->storage_id);
if (err != kTvmErrorNoError) {
fprintf(stderr, "memory allocate error: %08x", err);
return -1;
}
storage_id_count = 0;
while (reader->NextArrayItem(reader)) {
if (storage_id_count == num_items) {
fprintf(stderr, "array too big\n");
status = -1;
return status;
}
reader->ReadUnsignedInteger(reader, &(attr->storage_id[storage_id_count]));
storage_id_count++;
}
if (reader->NextArrayItem(reader)) {
fprintf(stderr, "Invalid json format\n");
status = -1;
break;
}
bitmask |= 2;
} else if (!strcmp(key, "shape")) {
reader->BeginArray(reader);
if (!(reader->NextArrayItem(reader))) {
fprintf(stderr, "Invalid json format\n");
status = -1;
break;
}
status = reader->ReadString(reader, type, sizeof(type));
if (status != 0) {
fprintf(stderr, "error reading shape array item\n");
break;
}
if (strcmp(type, "list_shape")) {
fprintf(stderr, "Invalid json format\n");
status = -1;
break;
}
if (!(reader->NextArrayItem(reader))) {
fprintf(stderr, "Invalid json format\n");
status = -1;
break;
}
reader->BeginArray(reader);
size_t num_items = 0;
if (reader->ArrayLength(reader, &num_items) != 0) {
fprintf(stderr, "error determing list_str length\n");
status = -1;
break;
}
DLDevice dev = {kDLCPU, 0};
tvm_crt_error_t err = TVMPlatformMemoryAllocate(
sizeof(int64_t) * TVM_CRT_MAX_NDIM * num_items, dev, (void**)&attr->shape);
if (err != kTvmErrorNoError) {
fprintf(stderr, "memory allocate error: %08x", err);
status = -1;
break;
}
err = TVMPlatformMemoryAllocate(sizeof(uint32_t) * num_items, dev, (void**)&attr->ndim);
if (err != kTvmErrorNoError) {
fprintf(stderr, "memory allocate error: %08x", err);
status = -1;
break;
}
shape_count = 0;
while (reader->NextArrayItem(reader)) {
if (shape_count == num_items) {
fprintf(stderr, "array too big\n");
status = -1;
return status;
}
reader->BeginArray(reader);
int64_t* attr_shape_ptr = attr->shape + shape_count * TVM_CRT_MAX_NDIM;
reader->ReadInteger(reader, attr_shape_ptr + 0);
uint32_t ndim = 1;
if (reader->NextArrayItem(reader)) {
for (ndim = 1; ndim < TVM_CRT_MAX_NDIM; ndim++) {
if (reader->NextArrayItem(reader)) {
reader->ReadInteger(reader, attr_shape_ptr + ndim);
} else {
break;
}
}
if (ndim == TVM_CRT_MAX_NDIM) {
reader->NextArrayItem(reader);
}
}
attr->ndim[shape_count] = ndim;
shape_count++;
}
attr->shape_count = shape_count;
if (reader->NextArrayItem(reader)) {
fprintf(stderr, "Invalid json format\n");
status = -1;
break;
}
bitmask |= 4;
} else if (!strcmp(key, "device_index")) {
reader->BeginArray(reader);
if (!(reader->NextArrayItem(reader))) {
fprintf(stderr, "Invalid json format\n");
status = -1;
break;
}
status = reader->ReadString(reader, type, sizeof(type));
if (status != 0) {
fprintf(stderr, "error reading device_index array item");
break;
}
if (strcmp(type, "list_int")) {
fprintf(stderr, "Invalid json format\n");
status = -1;
break;
}
if (!(reader->NextArrayItem(reader))) {
fprintf(stderr, "Invalid json format\n");
status = -1;
break;
}
size_t num_items = 0;
if (reader->ArrayLength(reader, &num_items) != 0) {
fprintf(stderr, "error determing list_int length\n");
status = -1;
break;
}
DLDevice dev = {kDLCPU, 0};
tvm_crt_error_t err =
TVMPlatformMemoryAllocate(sizeof(uint32_t) * num_items, dev, (void**)&attr->device_index);
if (err != kTvmErrorNoError) {
fprintf(stderr, "memory allocate error: %08x", err);
status = -1;
break;
}
device_index_count = 0;
while (reader->NextArrayItem(reader)) {
if (device_index_count == num_items) {
fprintf(stderr, "array too big\n");
status = -1;
return status;
}
reader->ReadUnsignedInteger(reader, &(attr->device_index[device_index_count]));
device_index_count++;
}
if (reader->NextArrayItem(reader)) {
fprintf(stderr, "Invalid json format\n");
status = -1;
break;
}
} else {
reader->BeginArray(reader);
if (!(reader->NextArrayItem(reader))) {
fprintf(stderr, "Invalid json format\n");
status = -1;
break;
}
reader->ReadString(reader, type, sizeof(type));
if (!strcmp(type, "list_int")) {
if (!(reader->NextArrayItem(reader))) {
fprintf(stderr, "Invalid json format\n");
status = -1;
break;
}
uint32_t temp_count = 0;
reader->BeginArray(reader);
while (reader->NextArrayItem(reader)) {
uint32_t temp;
reader->ReadUnsignedInteger(reader, &temp);
temp_count++;
}
} else if (!strcmp(type, "size_t")) {
if (!(reader->NextArrayItem(reader))) {
fprintf(stderr, "Invalid json format\n");
status = -1;
break;
}
uint32_t temp;
reader->ReadUnsignedInteger(reader, &temp);
} else {
fprintf(stderr, "cannot skip graph attr %s", key);
status = -1;
break;
}
if (reader->NextArrayItem(reader)) {
fprintf(stderr, "Invalid json format\n");
status = -1;
break;
}
}
}
if (bitmask != (1 | 2 | 4)) {
fprintf(stderr, "invalid format\n");
status = -1;
}
return status;
}