EEPROM is not longer PBC

This commit is contained in:
2026-07-06 17:24:09 +02:00
parent f63de56147
commit fbc51cc98b
7 changed files with 20 additions and 79 deletions

View File

@@ -13,7 +13,7 @@ Carbon is currently being organized in "milestones", below they are.
#### Milestone 2 #### Milestone 2
- [ ] On-demand native structs - [ ] On-demand native structs
- [ ] NativeComponent, and java-defined Component(s) - [ ] NativeComponent, and java-defined Component(s)
- [ ] Make nn_EEPROM *not* PBC'd. - [x] Make nn_EEPROM *not* PBC'd.
- [ ] JNIComponentHandler - [ ] JNIComponentHandler
- [ ] JNI Environment handler - [ ] JNI Environment handler
- [ ] Java-side userdata fields - [ ] Java-side userdata fields
@@ -31,4 +31,4 @@ Carbon is currently being organized in "milestones", below they are.
- [ ] Fix/add missing javadoc comments - [ ] Fix/add missing javadoc comments
- [ ] Point Makefile to the submodule's files instead of copying them over (for NeoNucleus) - [ ] Point Makefile to the submodule's files instead of copying them over (for NeoNucleus)
- [ ] Write a working emulator using Carbon *or* Hydrogen (NC-Telnet?) - [ ] Write a working emulator using Carbon *or* Hydrogen (NC-Telnet?)
- [ ] Begin work on Hydrogen - [ ] Begin work on Hydrogen

View File

@@ -19,9 +19,7 @@ public class NativeBindings {
nn_Universe universe = nn_createUniverse(ctx); nn_Universe universe = nn_createUniverse(ctx);
nn_Architecture arch = getLuaArch(); nn_Architecture arch = getLuaArch();
nn_EEPROM eeprom = new nn_EEPROM(2048, 2048, 1, 1, 1, 1, 1, 1); nn_EEPROM eeprom = new nn_EEPROM(2048, 2048, 1, 1, 1, 1, 1, 1);
eeprom.allocate();
nn_Component eepromCard = ncl_createEEPROM(universe, UUID.randomUUID().toString(), eeprom, "error('amog us')", false); nn_Component eepromCard = ncl_createEEPROM(universe, UUID.randomUUID().toString(), eeprom, "error('amog us')", false);
eeprom.free();
nn_Computer computer = nn_createComputer(universe, UUID.randomUUID().toString(), 1048576, 100, 100); nn_Computer computer = nn_createComputer(universe, UUID.randomUUID().toString(), 1048576, 100, 100);
nn_setCallBudget(computer, 0); nn_setCallBudget(computer, 0);
System.out.println("Arch: " + arch.name); System.out.println("Arch: " + arch.name);

View File

@@ -19,7 +19,7 @@ typedef struct nn_EEPROM {
double writeDataDelay; double writeDataDelay;
} nn_EEPROM; } nn_EEPROM;
*/ */
public class nn_EEPROM extends PointerBackedClass implements ManuallyAllocated { public class nn_EEPROM {
public final long size; public final long size;
public final long dataSize; public final long dataSize;
public final double readEnergyCost; public final double readEnergyCost;
@@ -47,8 +47,4 @@ public class nn_EEPROM extends PointerBackedClass implements ManuallyAllocated {
this.writeDelay = writeDelay; this.writeDelay = writeDelay;
this.writeDataDelay = writeDataDelay; this.writeDataDelay = writeDataDelay;
} }
@Override
public native boolean allocate();
@Override
public native boolean free();
} }

View File

@@ -120,6 +120,8 @@ JNIEXPORT jobject JNICALL Java_org_neoflock_NeoNucleus_NativeBindings_nn_1setCom
nn_Method nm = nMethods[i]; nn_Method nm = nMethods[i];
env->ReleaseStringUTFChars(nameStr, nm.name); env->ReleaseStringUTFChars(nameStr, nm.name);
env->ReleaseStringUTFChars(docStr, nm.doc); env->ReleaseStringUTFChars(docStr, nm.doc);
env->DeleteLocalRef(nameStr);
env->DeleteLocalRef(docStr);
} }
return Carbon::Map::To_nn_Exit(env, exitCode); return Carbon::Map::To_nn_Exit(env, exitCode);
@@ -144,15 +146,25 @@ JNIEXPORT jobject JNICALL Java_org_neoflock_NeoNucleus_NativeBindings_nn_1mountC
JNIEXPORT jobject JNICALL Java_org_neoflock_NeoNucleus_NativeBindings_ncl_1createEEPROM JNIEXPORT jobject JNICALL Java_org_neoflock_NeoNucleus_NativeBindings_ncl_1createEEPROM
(JNIEnv * env, jclass, jobject universe, jstring address, jobject eeprom, jstring code, jboolean isReadonly) { (JNIEnv * env, jclass, jobject universe, jstring address, jobject eeprom, jstring code, jboolean isReadonly) {
nn_Universe* nnUni = (nn_Universe*) Carbon::PointerBacked::GetPointer(env, universe); nn_Universe* nnUni = (nn_Universe*) Carbon::PointerBacked::GetPointer(env, universe);
nn_EEPROM* nnEEPROM = (nn_EEPROM*) Carbon::PointerBacked::GetPointer(env, eeprom);
NULLPTR_CHECK(nnUni, nn_Universe); NULLPTR_CHECK(nnUni, nn_Universe);
NULLPTR_CHECK(nnEEPROM, nn_EEPROM);
jclass eeclazz = env->GetObjectClass(eeprom);
nn_EEPROM nnEEPROM;
nnEEPROM.size = env->GetLongField(eeprom, env->GetFieldID(eeclazz, "size", "J"));
nnEEPROM.dataSize = env->GetLongField(eeprom, env->GetFieldID(eeclazz, "dataSize", "J"));
nnEEPROM.readEnergyCost = env->GetDoubleField(eeprom, env->GetFieldID(eeclazz, "readEnergyCost", "D"));
nnEEPROM.readDataEnergyCost = env->GetDoubleField(eeprom, env->GetFieldID(eeclazz, "readDataEnergyCost", "D"));
nnEEPROM.writeEnergyCost = env->GetDoubleField(eeprom, env->GetFieldID(eeclazz, "writeEnergyCost", "D"));
nnEEPROM.writeDataEnergyCost = env->GetDoubleField(eeprom, env->GetFieldID(eeclazz, "writeDataEnergyCost", "D"));
nnEEPROM.writeDelay = env->GetDoubleField(eeprom, env->GetFieldID(eeclazz, "writeDelay", "D"));
nnEEPROM.writeDataDelay = env->GetDoubleField(eeprom, env->GetFieldID(eeclazz, "writeDataDelay", "D"));
const char * addr = env->GetStringUTFChars(address, NULL); const char * addr = env->GetStringUTFChars(address, NULL);
const char * codeStr = env->GetStringUTFChars(code, NULL); const char * codeStr = env->GetStringUTFChars(code, NULL);
jsize codeLen = env->GetStringUTFLength(code); // TODO: check if this is the byte count or character count jsize codeLen = env->GetStringUTFLength(code); // TODO: check if this is the byte count or character count
nn_Component* comp = ncl_createEEPROM(nnUni, addr, nnEEPROM, codeStr, codeLen, isReadonly); nn_Component* comp = ncl_createEEPROM(nnUni, addr, &nnEEPROM, codeStr, codeLen, isReadonly);
env->ReleaseStringUTFChars(address, addr); env->ReleaseStringUTFChars(address, addr);
env->ReleaseStringUTFChars(code, codeStr); env->ReleaseStringUTFChars(code, codeStr);
@@ -254,4 +266,4 @@ JNIEXPORT jstring JNICALL Java_org_neoflock_NeoNucleus_NativeBindings_nn_1getErr
const char* str = nn_getError(nnPC); const char* str = nn_getError(nnPC);
jstring jstr = env->NewStringUTF(str); jstring jstr = env->NewStringUTF(str);
return jstr; return jstr;
} }

View File

@@ -1,36 +0,0 @@
#include "org_neoflock_NeoNucleus_nn_EEPROM.h"
#include <cstdlib>
#include <cstring>
#include "carbon.hpp"
// FIXME: doesn't check for null
#define GET_LONG_FIELD(name) eepromNative->name = (uint64_t) env->GetLongField(eeprom, env->GetFieldID(clazz, #name, "J"));
#define GET_DOUBLE_FIELD(name) eepromNative->name = (double) env->GetDoubleField(eeprom, env->GetFieldID(clazz, #name, "D"));
JNIEXPORT jboolean JNICALL Java_org_neoflock_NeoNucleus_nn_1EEPROM_allocate
(JNIEnv * env, jobject eeprom) {
jclass clazz = env->GetObjectClass(eeprom);
//jfieldID fid = env->GetFieldID(clazz, "ptr", "J");
//jlong size = env->GetLongField(eeprom, fid);
nn_EEPROM * eepromNative = (nn_EEPROM*)malloc(sizeof(nn_EEPROM));
GET_LONG_FIELD(size);
GET_LONG_FIELD(dataSize);
GET_DOUBLE_FIELD(readEnergyCost);
GET_DOUBLE_FIELD(readDataEnergyCost);
GET_DOUBLE_FIELD(writeEnergyCost);
GET_DOUBLE_FIELD(writeDataEnergyCost);
GET_DOUBLE_FIELD(writeDelay);
GET_DOUBLE_FIELD(writeDelay);
//printf("double_size=%d, %d %d %lf %lf %lf\n", sizeof(double), eepromNative->size, eepromNative->dataSize, eepromNative->readEnergyCost, eepromNative->readDataEnergyCost, eepromNative->writeEnergyCost);
return Carbon::PointerBacked::SetPointer(env, eeprom, eepromNative);
}
JNIEXPORT jboolean JNICALL Java_org_neoflock_NeoNucleus_nn_1EEPROM_free
(JNIEnv * env, jobject eeprom) {
if (Carbon::PointerBacked::GetPointer(env, eeprom) == NULL) {
NULLPTR_THROW(nn_EEPROM);
return false;
}
// assuming free(NULL) does nothing, this should be fine
free(Carbon::PointerBacked::GetPointer(env, eeprom));
Carbon::PointerBacked::ResetPointer(env, eeprom);
return true;
}

View File

@@ -1,29 +0,0 @@
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class org_neoflock_NeoNucleus_nn_EEPROM */
#ifndef _Included_org_neoflock_NeoNucleus_nn_EEPROM
#define _Included_org_neoflock_NeoNucleus_nn_EEPROM
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: org_neoflock_NeoNucleus_nn_EEPROM
* Method: allocate
* Signature: ()Z
*/
JNIEXPORT jboolean JNICALL Java_org_neoflock_NeoNucleus_nn_1EEPROM_allocate
(JNIEnv *, jobject);
/*
* Class: org_neoflock_NeoNucleus_nn_EEPROM
* Method: free
* Signature: ()Z
*/
JNIEXPORT jboolean JNICALL Java_org_neoflock_NeoNucleus_nn_1EEPROM_free
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif