// forum: https://forum.arduino.cc/t/progmem-data-gets-corrupted/1104308
// This Wokwi project: https://wokwi.com/projects/359730339366253569
//
// PROGMEM gets corrupted at dataset 47
// With Arduino IDE 1.8.7./Arduino Mega/Programmer AVRISP mkII
enum pinType { X, w, r, g, p1, p2, p3, p4, p5};
const char* pinTypeText[] = { "X", "w", "r", "g", "p1", "p2", "p3", "p4", "p4"};
const int N_edges = 89;
const int N_nodes = 74;
struct Element_Pin {
byte Sch_neighbor;
pinType pin_neighbor;
};
struct Element_Data {
char Name[16];
Element_Pin Pin[5];
};
//topology in flash, size 17 x 164 = 2788 Bytes
const Element_Data topology[N_edges + N_nodes + 1] PROGMEM = {
{"noElem", {{ 0, X}, { 0, X}, { 0, X}, { 0, X}, { 0, X}}}, // 0
{"A:A2" , {{ 53, p2}, { 10, w}, { 0, X}, { 0, X}, { 0, X}}}, // 1
{"A:A4" , {{ 7, g}, { 10, r}, { 0, X}, { 0, X}, { 0, X}}}, // 2
{"A:A5" , {{ 7, r}, { 11, r}, { 0, X}, { 0, X}, { 0, X}}}, // 3
{"A:A6" , {{ 8, r}, { 12, r}, { 0, X}, { 0, X}, { 0, X}}}, // 4
{"A:A7" , {{ 9, r}, { 12, g}, { 0, X}, { 0, X}, { 0, X}}}, // 5
{"A:A9" , {{ 45, w}, { 9, w}, { 0, X}, { 0, X}, { 0, X}}}, // 6
{"A:Wk1" , {{ 8, g}, { 3, p1}, { 2, p1}, { 0, X}, { 0, X}}}, // 7
{"A:Wk2" , {{ 9, g}, { 4, p1}, { 7, w}, { 0, X}, { 0, X}}}, // 8
{"A:Wk3" , {{ 6, p2}, { 5, p1}, { 8, w}, { 0, X}, { 0, X}}}, // 9
{"A:Wu4" , {{ 1, p2}, { 2, p2}, { 11, w}, { 0, X}, { 0, X}}}, // 10
{"A:Wu5" , {{ 10, g}, { 3, p2}, { 12, w}, { 0, X}, { 0, X}}}, // 11
{"A:Wu6" , {{ 11, g}, { 4, p2}, { 5, p2}, { 0, X}, { 0, X}}}, // 12
{"B:A2" , {{155, w}, { 22, w}, { 0, X}, { 0, X}, { 0, X}}}, // 13
{"B:A4" , {{ 19, g}, { 22, r}, { 0, X}, { 0, X}, { 0, X}}}, // 14
{"B:A5" , {{ 19, r}, { 23, r}, { 0, X}, { 0, X}, { 0, X}}}, // 15
{"B:A6" , {{ 20, r}, { 24, r}, { 0, X}, { 0, X}, { 0, X}}}, // 16
{"B:A7" , {{ 21, r}, { 24, g}, { 0, X}, { 0, X}, { 0, X}}}, // 17
{"B:A9" , {{148, w}, { 21, w}, { 0, X}, { 0, X}, { 0, X}}}, // 18
{"B:Wk1" , {{ 20, g}, { 15, p1}, { 14, p1}, { 0, X}, { 0, X}}}, // 19
{"B:Wk2" , {{ 21, g}, { 16, p1}, { 19, w}, { 0, X}, { 0, X}}}, // 20
{"B:Wk3" , {{ 18, p2}, { 17, p1}, { 20, w}, { 0, X}, { 0, X}}}, // 21
{"B:Wu4" , {{ 13, p2}, { 14, p2}, { 23, w}, { 0, X}, { 0, X}}}, // 22
{"B:Wu5" , {{ 22, g}, { 15, p2}, { 24, w}, { 0, X}, { 0, X}}}, // 23
{"B:Wu6" , {{ 23, g}, { 16, p2}, { 17, p2}, { 0, X}, { 0, X}}}, // 24
{"C:A1" , {{ 36, w}, {120, w}, { 0, X}, { 0, X}, { 0, X}}}, // 25
{"C:A2" , {{ 36, r}, { 37, w}, { 0, X}, { 0, X}, { 0, X}}}, // 26
{"C:A4" , {{ 32, g}, { 37, r}, { 0, X}, { 0, X}, { 0, X}}}, // 27
{"C:A5" , {{ 32, r}, { 38, r}, { 0, X}, { 0, X}, { 0, X}}}, // 28
{"C:A6" , {{ 33, r}, { 39, r}, { 0, X}, { 0, X}, { 0, X}}}, // 29
{"C:A7" , {{ 34, r}, { 40, r}, { 0, X}, { 0, X}, { 0, X}}}, // 30
{"C:A8" , {{ 35, r}, { 40, g}, { 0, X}, { 0, X}, { 0, X}}}, // 31
{"C:Wk1" , {{ 33, g}, { 28, p1}, { 27, p1}, { 0, X}, { 0, X}}}, // 32
{"C:Wk2" , {{ 34, g}, { 29, p1}, { 32, w}, { 0, X}, { 0, X}}}, // 33
{"C:Wk3" , {{ 35, g}, { 30, p1}, { 33, w}, { 0, X}, { 0, X}}}, // 34
{"C:Wk4" , {{ 36, g}, { 31, p1}, { 34, w}, { 0, X}, { 0, X}}}, // 35
{"C:Wk5" , {{ 25, p1}, { 26, p1}, { 35, w}, { 0, X}, { 0, X}}}, // 36
{"C:Wu6" , {{ 26, p2}, { 27, p2}, { 38, w}, { 0, X}, { 0, X}}}, // 37
{"C:Wu7" , {{ 37, g}, { 28, p2}, { 39, w}, { 0, X}, { 0, X}}}, // 38
{"C:Wu8" , {{ 38, g}, { 29, p2}, { 40, w}, { 0, X}, { 0, X}}}, // 39
{"C:Wu9" , {{ 39, g}, { 30, p2}, { 31, p2}, { 0, X}, { 0, X}}}, // 40
{"1:A1" , {{ 46, r}, { 47, r}, { 0, X}, { 0, X}, { 0, X}}}, // 41
{"2:A3" , {{ 43, p2}, { 47, g}, { 0, X}, { 0, X}, { 0, X}}}, // 42
{"2:A2" , {{ 46, g}, { 42, p1}, { 0, X}, { 0, X}, { 0, X}}}, // 43
{"3:A2" , {{152, w}, { 55, w}, { 0, X}, { 0, X}, { 0, X}}}, // 44
{"W21" , {{ 6, p1}, { 53, p1}, { 46, w}, { 0, X}, { 0, X}}}, // 45
{"W22" , {{ 45, g}, { 41, p1}, { 43, p1}, { 0, X}, { 0, X}}}, // 46
{"Wk2" , {{ 3, }, { 3, }, { 5, }, { 5, X}, { 0, X}}}, // 47
{"Wk24" , {{ 50, p1}, { 54, p3}, { 47, w}, { 0, X}, { 0, X}}}, // 48
{"W25" , {{ 50, p2}, { 55, g}, {163, p2}, { 0, X}, { 0, X}}}, // 49
{"Svd22" , {{ 48, w}, { 49, w}, { 0, X}, { 0, X}, { 0, X}}}, // 50
{"3:A2" , {{ 53, p4}, { 52, p1}, { 0, X}, { 0, X}, { 0, X}}}, // 51
{"3:A4" , {{ 51, p2}, { 54, p2}, { 0, X}, { 0, X}, { 0, X}}}, // 52
{"Wu31" , {{ 45, r}, { 1, p1}, { 67, p1}, { 51, p1}, { 0, X}}}, // 53
{"Wu32" , {{ 70, p3}, { 52, p2}, { 48, r}, { 55, r}, { 0, X}}}, // 54
{"W33" , {{ 44, p2}, { 54, p4}, { 49, r}, { 0, X}, { 0, X}}}, // 55
{"4:A1" , {{ 0, X}, { 57, p1}, { 0, X}, { 0, X}, { 0, X}}}, // 56
{"4:A2" , {{ 56, p2}, { 67, p2}, { 0, X}, { 0, X}, { 0, X}}}, // 57
{"4:A4" , {{ 67, p4}, { 59, p1}, { 0, X}, { 0, X}, { 0, X}}}, // 58
{"4:A5" , {{ 58, p2}, { 60, p1}, { 0, X}, { 0, X}, { 0, X}}}, // 59
{"4:A6" , {{ 59, p2}, { 68, w}, { 0, X}, { 0, X}, { 0, X}}}, // 60
{"4:A8" , {{ 73, g}, { 0, X}, { 0, X}, { 0, X}, { 0, X}}}, // 61
{"451" , {{ 75, r}, { 71, r}, { 0, X}, { 0, X}, { 0, X}}}, // 62
{"461" , {{ 74, r}, { 72, r}, { 0, X}, { 0, X}, { 0, X}}}, // 63
{"471" , {{ 74, g}, { 73, r}, { 0, X}, { 0, X}, { 0, X}}}, // 64
{"44" , {{ 70, p4}, { 71, w}, { 0, X}, { 0, X}, { 0, X}}}, // 65
{"49" , {{116, p2}, { 75, w}, { 0, X}, { 0, X}, { 0, X}}}, // 66
{"Wu41" , {{ 53, p3}, { 57, p2}, { 86, p1}, { 58, p1}, { 0, X}}}, // 67
{"W42" , {{ 60, p2}, { 69, p2}, { 70, p2}, { 0, X}, { 0, X}}}, // 68
{"Wk43" , {{ 87, p3}, { 68, r}, { 70, p1}, { 88, p1}, { 0, X}}}, // 69
{"Wu44" , {{ 69, p3}, { 68, g}, { 54, p1}, { 65, p1}, { 0, X}}}, // 70
{"W45" , {{ 65, p2}, { 62, p2}, { 72, w}, { 0, X}, { 0, X}}}, // 71
{"W46" , {{ 71, g}, { 63, p2}, { 73, w}, { 0, X}, { 0, X}}}, // 72
{"W47" , {{ 72, g}, { 64, p2}, { 61, p1}, { 0, X}, { 0, X}}}, // 73
{"W48" , {{ 75, g}, { 63, p1}, { 64, p1}, { 0, X}, { 0, X}}}, // 74
{"W49" , {{ 66, p2}, { 62, p1}, { 74, w}, { 0, X}, { 0, X}}}, // 75
{"5:A1" , {{ 0, X}, { 86, p2}, { 0, X}, { 0, X}, { 0, X}}}, // 76
{"5:A2" , {{ 86, p4}, { 78, p1}, { 0, X}, { 0, X}, { 0, X}}}, // 77
{"5:A3" , {{ 77, p2}, { 79, p1}, { 0, X}, { 0, X}, { 0, X}}}, // 78
{"5:A4" , {{ 78, p2}, { 87, p2}, { 0, X}, { 0, X}, { 0, X}}}, // 79
{"5" , {{ 88, p4}, { 89, w}, { 0, X}, { 0, X}, { 0, X}}}, // 80
{"53" , {{ 82, p2}, { 88, p3}, { 0, X}, { 0, X}, { 0, X}}}, // 81
{"531" , {{120, g}, { 81, p1}, { 0, X}, { 0, X}, { 0, X}}}, // 82
{"5:A7" , {{119, p2}, { 90, g}, { 0, X}, { 0, X}, { 0, X}}}, // 83
{"5:A8" , {{118, p2}, { 90, r}, { 0, X}, { 0, X}, { 0, X}}}, // 84
{"5:A9" , {{117, p2}, { 89, r}, { 0, X}, { 0, X}, { 0, X}}}, // 85
{"Wu51" , {{ 67, p3}, { 76, p2}, { 93, r}, { 77, p1}, { 0, X}}}, // 86
{"Wu52" , {{ 95, p2}, { 79, p2}, { 69, p1}, { 88, p2}, { 0, X}}}, // 87
{"Wu53" , {{ 69, p4}, { 87, p4}, { 81, p2}, { 80, p1}, { 0, X}}}, // 88
{"W54" , {{ 80, p2}, { 85, p2}, { 90, w}, { 0, X}, { 0, X}}}, // 89
{"W55" , {{ 89, g}, { 84, p2}, { 83, p2}, { 0, X}, { 0, X}}}, // 90
{"6" , {{ 93, w}, { 94, g}, { 0, X}, { 0, X}, { 0, X}}}, // 91
{"6:A1" , {{ 0, X}, { 93, g}, { 0, X}, { 0, X}, { 0, X}}}, // 92
{"61" , {{ 91, p1}, { 86, p3}, { 92, p2}, { 0, X}, { 0, X}}}, // 93
{"62" , {{ 95, p1}, { 96, p2}, { 91, p2}, { 0, X}, { 0, X}}}, // 94
{"67" , {{ 94, w}, { 87, p1}, { 0, X}, { 0, X}, { 0, X}}}, // 95
{"7" , {{ 0, X}, { 94, r}, { 0, X}, { 0, X}, { 0, X}}}, // 96
{"100" , {{ 0, X}, {110, w}, { 0, X}, { 0, X}, { 0, X}}}, // 97
{"102" , {{109, r}, { 0, X}, { 0, X}, { 0, X}, { 0, X}}}, // 98
{"110" , {{ 0, X}, {111, g}, { 0, X}, { 0, X}, { 0, X}}}, // 99
{"111" , {{ 0, X}, {111, r}, { 0, X}, { 0, X}, { 0, X}}}, // 100
{"112" , {{112, w}, {124, p1}, { 0, X}, { 0, X}, { 0, X}}}, // 101
{"10:A1" , {{108, r}, {103, p1}, { 0, X}, { 0, X}, { 0, X}}}, // 102
{"10:A2" , {{102, p2}, {107, p3}, { 0, X}, { 0, X}, { 0, X}}}, // 103
{"10:A3" , {{110, g}, {105, p1}, { 0, X}, { 0, X}, { 0, X}}}, // 104
{"10:A4" , {{104, p2}, {107, p4}, { 0, X}, { 0, X}, { 0, X}}}, // 105
{"10:A5" , {{107, p4}, { 0, X}, { 0, X}, { 0, X}, { 0, X}}}, // 106
{"103" , {{103, p2}, {105, p2}, {106, p1}, { 0, X}, { 0, X}}}, // 107
{"W101" , {{109, g}, {102, p1}, {112, r}, { 0, X}, { 0, X}}}, // 108
{"W102" , {{110, r}, { 98, p1}, {108, w}, { 0, X}, { 0, X}}}, // 109
{"W103" , {{ 97, p2}, {109, w}, {104, p1}, { 0, X}, { 0, X}}}, // 110
{"W111" , {{112, g}, {100, p2}, { 99, p2}, { 0, X}, { 0, X}}}, // 111
{"W112" , {{101, p1}, {108, g}, {111, w}, { 0, X}, { 0, X}}}, // 112
{"12:A1" , {{122, w}, {114, p1}, { 0, X}, { 0, X}, { 0, X}}}, // 113
{"12:A2" , {{113, p2}, {115, p1}, { 0, X}, { 0, X}, { 0, X}}}, // 114
{"12:A3" , {{114, p2}, {123, w}, { 0, X}, { 0, X}, { 0, X}}}, // 115
{"12:A7" , {{125, g}, { 66, p1}, { 0, X}, { 0, X}, { 0, X}}}, // 116
{"12:A8" , {{126, r}, { 85, p1}, { 0, X}, { 0, X}, { 0, X}}}, // 117
{"12:A9" , {{127, r}, { 84, p1}, { 0, X}, { 0, X}, { 0, X}}}, // 118
{"12:A10", {{127, g}, { 83, p1}, { 0, X}, { 0, X}, { 0, X}}}, // 119
{"W121" , {{ 25, p2}, {122, r}, { 82, p1}, { 0, X}, { 0, X}}}, // 120
{"W122" , {{137, p2}, {122, g}, {144, p1}, { 0, X}, { 0, X}}}, // 121
{"W123" , {{113, p1}, {120, r}, {121, r}, { 0, X}, { 0, X}}}, // 122
{"W124" , {{115, p2}, {145, p3}, {124, p2}, { 0, X}, { 0, X}}}, // 123
{"Wu125" , {{101, p2}, {123, g}, {146, r}, {125, w}, { 0, X}}}, // 124
{"W126" , {{124, p4}, {126, w}, {116, p1}, { 0, X}, { 0, X}}}, // 125
{"W127" , {{125, r}, {117, p1}, {127, w}, { 0, X}, { 0, X}}}, // 126
{"W128" , {{126, g}, {118, p1}, {119, p1}, { 0, X}, { 0, X}}}, // 127
{"140" , {{144, p4}, {134, p1}, { 0, X}, { 0, X}, { 0, X}}}, // 128
{"141" , {{ 0, X}, {140, r}, { 0, X}, { 0, X}, { 0, X}}}, // 129
{"142" , {{ 0, X}, {140, g}, { 0, X}, { 0, X}, { 0, X}}}, // 130
{"143" , {{ 0, X}, {141, r}, { 0, X}, { 0, X}, { 0, X}}}, // 131
{"144" , {{ 0, X}, {143, r}, { 0, X}, { 0, X}, { 0, X}}}, // 132
{"145" , {{ 0, X}, {143, g}, { 0, X}, { 0, X}, { 0, X}}}, // 133
{"146" , {{128, p2}, {145, p2}, { 0, X}, { 0, X}, { 0, X}}}, // 134
{"148" , {{147, w}, {138, p1}, { 0, X}, { 0, X}, { 0, X}}}, // 135
{"14:A1" , {{ 0, X}, {137, p1}, { 0, X}, { 0, X}, { 0, X}}}, // 136
{"14:A2" , {{136, p2}, {121, w}, { 0, X}, { 0, X}, { 0, X}}}, // 137
{"14:A3" , {{135, p2}, {139, p1}, { 0, X}, { 0, X}, { 0, X}}}, // 138
{"14:A4" , {{138, p2}, { 0, X}, { 0, X}, { 0, X}, { 0, X}}}, // 139
{"W141" , {{141, g}, {129, p2}, {130, p2}, { 0, X}, { 0, X}}}, // 140
{"W142" , {{142, g}, {131, p2}, {140, w}, { 0, X}, { 0, X}}}, // 141
{"W143" , {{144, p2}, {143, w}, {141, w}, { 0, X}, { 0, X}}}, // 142
{"W144" , {{142, r}, {132, p2}, {133, p2}, { 0, X}, { 0, X}}}, // 143
{"Wu145" , {{121, g}, {142, w}, {149, p3}, {128, p1}, { 0, X}}}, // 144
{"Wk146" , {{150, r}, {134, p2}, {123, r}, {146, g}, { 0, X}}}, // 145
{"W147" , {{147, r}, {124, p3}, {145, p4}, { 0, X}, { 0, X}}}, // 146
{"W148" , {{135, p1}, {146, w}, {151, p3}, { 0, X}, { 0, X}}}, // 147
{"W151" , {{ 18, p1}, {156, p2}, {149, p2}, { 0, X}, { 0, X}}}, // 148
{"Wk152" , {{157, r}, {148, g}, {144, p3}, {153, p1}, { 0, X}}}, // 149
{"W153" , {{151, p2}, {145, p1}, {154, p2}, { 0, X}, { 0, X}}}, // 150
{"Wu154" , {{159, p2}, {150, w}, {147, g}, {152, r}, { 0, X}}}, // 151
{"W155" , {{ 44, p1}, {151, p4}, {161, p2}, { 0, X}, { 0, X}}}, // 152
{"15:A1" , {{149, p4}, {154, p1}, { 0, X}, { 0, X}, { 0, X}}}, // 153
{"15:A2" , {{153, p2}, {150, g}, { 0, X}, { 0, X}, { 0, X}}}, // 154
{"Wk161" , {{ 13, p1}, {162, p1}, {156, p1}, { 0, X}, { 0, X}}}, // 155
{"Wk162" , {{155, g}, {148, r}, {157, g}, {160, p1}, { 0, X}}}, // 156
{"W163" , {{158, p1}, {149, p1}, {156, p3}, { 0, X}, { 0, X}}}, // 157
{"16:A1" , {{157, w}, {159, p1}, { 0, X}, { 0, X}, { 0, X}}}, // 158
{"16" , {{158, p2}, {151, p1}, { 0, X}, { 0, X}, { 0, X}}}, // 159
{"17:A1" , {{156, p4}, {161, p1}, { 0, X}, { 0, X}, { 0, X}}}, // 160
{"Svd172", {{160, p2}, {152, g}, { 0, X}, { 0, X}, { 0, X}}}, // 161
{"18:A1" , {{155, r}, {163, p1}, { 0, X}, { 0, X}, { 0, X}}}, // 162
{"18:A2" , {{162, p2}, { 49, g}, { 0, X}, { 0, X}, { 0, X}}}, // 163
};
void setup() {
Serial.begin(115200);
// print topology
for (int i = 0; i < N_edges + N_nodes + 1; i++) {
ElementPrint( i);
}
}
void loop() {}
void ElementPrint( int index)
{
Element_Data myElement;
// Copy the struct item to sram to make it easier to handle
memcpy_P( &myElement, &topology[index], sizeof(Element_Data));
Serial.print(index);
Serial.print(" : ");
Serial.print( myElement.Name);
Serial.print(" ");
for( int j=0; j<5; j++)
{
Serial.print("{");
Serial.print( myElement.Pin[j].Sch_neighbor);
Serial.print(" ");
Serial.print( pinTypeText[myElement.Pin[j].pin_neighbor]);
Serial.print("}, ");
}
Serial.println();
}
// #######################################################################
// Extra function. Use it instead of ElementPrint to
// generate the source code of the elements for the table
void ElementPrintExtra( int index)
{
Element_Data myElement;
// Copy the struct item to sram to make it easier to handle
memcpy_P( &myElement, &topology[index], sizeof(Element_Data));
// Two large buffer on the stack, only for testing/development
char buffer[100];
char format[100];
char spaces[] = " ";
int l = strlen(myElement.Name);
int n = 6 - l; // number of spaces
spaces[n] = '\0';
snprintf( buffer, sizeof(buffer),
" {\"%s\"%s, {{%3d, %2s}, {%3d, %2s}, {%3d, %2s}, {%3d, %2s}, {%3d, %2s}}}, // %3d",
myElement.Name,
spaces,
myElement.Pin[0].Sch_neighbor, pinTypeText[myElement.Pin[0].pin_neighbor],
myElement.Pin[1].Sch_neighbor, pinTypeText[myElement.Pin[1].pin_neighbor],
myElement.Pin[2].Sch_neighbor, pinTypeText[myElement.Pin[2].pin_neighbor],
myElement.Pin[3].Sch_neighbor, pinTypeText[myElement.Pin[3].pin_neighbor],
myElement.Pin[4].Sch_neighbor, pinTypeText[myElement.Pin[4].pin_neighbor],
index);
Serial.print( buffer);
Serial.print('\n');
}
mega:SCL
mega:SDA
mega:AREF
mega:GND.1
mega:13
mega:12
mega:11
mega:10
mega:9
mega:8
mega:7
mega:6
mega:5
mega:4
mega:3
mega:2
mega:1
mega:0
mega:14
mega:15
mega:16
mega:17
mega:18
mega:19
mega:20
mega:21
mega:5V.1
mega:5V.2
mega:22
mega:23
mega:24
mega:25
mega:26
mega:27
mega:28
mega:29
mega:30
mega:31
mega:32
mega:33
mega:34
mega:35
mega:36
mega:37
mega:38
mega:39
mega:40
mega:41
mega:42
mega:43
mega:44
mega:45
mega:46
mega:47
mega:48
mega:49
mega:50
mega:51
mega:52
mega:53
mega:GND.4
mega:GND.5
mega:IOREF
mega:RESET
mega:3.3V
mega:5V
mega:GND.2
mega:GND.3
mega:VIN
mega:A0
mega:A1
mega:A2
mega:A3
mega:A4
mega:A5
mega:A6
mega:A7
mega:A8
mega:A9
mega:A10
mega:A11
mega:A12
mega:A13
mega:A14
mega:A15