KiCad PCB EDA Suite
Loading...
Searching...
No Matches
allegro_pcb_structs.h
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright Quilter
5 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 3
10 * of the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, you may find one here:
19 * http://www.gnu.org/licenses/gpl-3.0.html
20 * or you may search the http://www.gnu.org website for the version 3 license,
21 * or you may write to the Free Software Foundation, Inc.,
22 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
23 */
24
25#pragma once
26
27#include "string_any_map.h"
28
29
30#include <array>
31#include <cstdint>
32#include <optional>
33#include <memory>
34#include <stdexcept>
35#include <string>
36#include <unordered_map>
37#include <variant>
38#include <vector>
39
40
41namespace ALLEGRO
42{
43
54{
55public:
56 BLOCK_BASE( uint8_t aBlockType, size_t aOffset ) :
57 m_blockType( aBlockType ),
58 m_offset( aOffset )
59 {}
60
61 virtual ~BLOCK_BASE() = default;
62
63 uint8_t GetBlockType() const { return m_blockType; }
64 size_t GetOffset() const { return m_offset; }
65
66 // If this block data has a key, return it, else 0
67 uint32_t GetKey() const;
68
69private:
70 uint8_t m_blockType;
71 size_t m_offset;
72};
73
74
75template <typename T>
76class BLOCK : public BLOCK_BASE
77{
78public:
79 BLOCK( uint8_t aBlockType, size_t aOffset ) :
80 BLOCK_BASE( aBlockType, aOffset )
81 {}
82
83 const T& GetData() const { return m_data; }
84 T& GetData() { return m_data; }
85
86private:
88};
89
90
92{
93 x1B_NET = 0x1B,
94};
95
96
107enum class FMT_VER
108{
110 V_PRE_V16, // Allegro versions before 16.0 (unsupported binary format)
111 V_160, // Allegro 16.0, 0x00130000
112 V_162, // Allegro 16.2 0x00130400
113 V_164, // Allegro 16.4, 0x00130C00
114 V_165, // Allegro 16.5, 0x00131000
115 V_166, // Allegro 16.6, 0x00131500
116 V_172, // Allegro 17.2, 0x00140400
117 V_174, // Allegro 17.4, 0x00140900
118 V_175, // Allegro 17.5, 0x00141500
119 V_180, // Allegro 18.0, 0x00150000
120};
121
122constexpr bool operator>=( FMT_VER lhs, FMT_VER rhs )
123{
124 return static_cast<uint32_t>( lhs ) >= static_cast<uint32_t>( rhs );
125}
126
127
128template <typename T>
130{
131 using value_type = T;
132
137 virtual bool exists( FMT_VER ver ) const = 0;
138
139 // Access to the value (use std::optional-like semantics)
140 T& value() { return *m_Value; }
141 const T& value() const { return *m_Value; }
142 bool has_value() const { return m_Value.has_value(); }
143
144 const T& value_or( const T& aDefault ) const { return has_value() ? value() : aDefault; }
145
146 T& operator*() { return *m_Value; }
147 const T& operator*() const { return *m_Value; }
148
149 T* operator->() { return m_Value.operator->(); }
150 const T* operator->() const { return m_Value.operator->(); }
151
152 // Assigmnent operator
154 {
155 m_Value = value;
156 return *this;
157 }
159 {
160 m_Value = std::move( value );
161 return *this;
162 }
163
164private:
165 std::optional<T> m_Value;
166};
167
168
173template <FMT_VER MinVersion, typename T>
174struct COND_GE : public COND_FIELD_BASE<T>
175{
176 constexpr bool exists( FMT_VER ver ) const override { return ver >= MinVersion; }
177
178 using COND_FIELD_BASE<T>::operator=;
179};
180
181
186template <FMT_VER MaxVersion, typename T>
187struct COND_LT : public COND_FIELD_BASE<T>
188{
189 constexpr bool exists( FMT_VER ver ) const override { return ver < MaxVersion; }
190
191 using COND_FIELD_BASE<T>::operator=;
192};
193
194
199template <FMT_VER GEVersion, FMT_VER LTVersion, typename T>
200struct COND_GE_LT : public COND_FIELD_BASE<T>
201{
202 constexpr bool exists( FMT_VER ver ) const override { return ver >= GEVersion && ver < LTVersion; }
203
204 using COND_FIELD_BASE<T>::operator=;
205};
206
207
209{
210 MILS = 0x01,
211 INCHES = 0x02,
215};
216
217
226{
228 {
229 uint32_t m_A;
231 };
232
239 {
240 uint32_t m_Tail;
241 uint32_t m_Head;
242 };
243
244 uint32_t m_Magic;
245
246 uint32_t m_Unknown1a; // 0x03
247 uint32_t m_FileRole; // 0x01 (.brd) or 0x02 (.dra) (?)
248 uint32_t m_Unknown1b; // 0x03
249 uint32_t m_WriterProgram; // 0x09 (Allegro) or 0x130000 (DB Doctor) (?)
250
252
253 uint32_t m_UnknownMagic; // This is always 0x000a0d0a?
254 uint32_t m_UnknownFlags; // This looks like flags: 0x01000000, 0x0400000, 0x06000000
255
256 // In this block of 7 uint32s, it seems they have very different meanings pre and post v18
257
258 // Pre v18, these are all unknown
259 // - 3 and 4 are the same.
260 // - 5 and 6 arer of a similar size
262
263 // V18
264 COND_GE<FMT_VER::V_180, uint32_t> m_Unknown2a_V18; // Looks like an 'end pointer' like 0x27_end
271
272 // V180 has 6 additional linked lists in the header
273 // 5 of them are at the start
279
280 // Linked lists grouping top-level elements by type
281 LINKED_LIST m_LL_0x04; // Net assignments
282 LINKED_LIST m_LL_0x06; // Component definitions
283 LINKED_LIST m_LL_0x0C; // Pin definitions
284 LINKED_LIST m_LL_Shapes; // Shape segments (0x0E) and shapes (0x28)
287 LINKED_LIST m_LL_0x1C; // Padstacks
288 LINKED_LIST m_LL_0x24_0x28; // Rects and shapes
290 LINKED_LIST m_LL_0x2B; // Footprint definitions
291 LINKED_LIST m_LL_0x03_0x30; // Fields (0x03) and string wrappers (0x30)
292 LINKED_LIST m_LL_0x0A; // DRC elements
293 LINKED_LIST m_LL_0x1D_0x1E_0x1F; // Constraint sets, SI models, padstack dims
297 LINKED_LIST m_LL_0x0C_2; // Secondary pin definitions
299
300 // For some reason the 0x35 extents are recorded in the header
303
307
310
312
314
317
318 // Fixed length string field
319 std::array<char, 60> m_AllegroVersion;
320
321 uint32_t m_Unknown4;
322
323 uint32_t m_MaxKey;
324
327
329 // 3 empty bytes here?
330
331 uint32_t m_Unknown6;
333
334 // The end of the 0x27 object(?)
335 // In V18, this is relocated to m_0x27_End_V18
337
338 uint32_t m_Unknown8;
339
341
342 std::array<uint32_t, 50> m_Unknown9;
343
344 uint32_t m_Unknown10a; // Often 0x000500FF
345 uint32_t m_Unknown10b; // Similar to 0xFFA60000
346 uint32_t m_Unknown10c; // Usually 0x01
347
348 // E.g. 1000 for mils
350
357 std::array<LAYER_MAP_ENTRY, 25> m_LayerMap;
358
359 uint32_t GetStringsCount() const
360 {
361 if( m_StringCount_V18.has_value() )
362 return m_StringCount_V18.value();
363
364 return m_StringCount_preV18.value();
365 }
366
367 uint32_t Get_0x27_End() const
368 {
369 if( m_0x27_End_V18.has_value() )
370 return m_0x27_End_V18.value();
371
372 return m_0x27_End_preV18.value();
373 }
374
376 {
377 if( m_LL_Unknown5_V18.has_value() )
378 return m_LL_Unknown5_V18.value();
379
380 return m_LL_Unknown5_preV18.value();
381 }
382};
383
384
386{
412
419 {
420 // BOARD_GEOMETRY
421 // BGEOM_PASTEMASK_BOTTOM = 0x??
422 // BGEOM_PASTEMASK_TOP = 0x??
443
444 // COMPONENT_VALUE / DEVICE_TYPE / USER_PART_NUMBER
445 // REF_DES / TOLERANCE
452
453 // ANALYSIS
460
461 // DRAWING_FORMAT
467
468 // PACKAGE_GEOMETRY
486
487 // MANUFACTURING
502
503 // CONSTRAINTS_REGION
504 CREG_ALL = 0xFD,
505
506 // PACKAGE_KEEPIN / ROUTE_KEEPIN
508
509 // PACKAGE_KEEPOUT / ROUTE_KEEPOUT / VIA_KEEPOUT
513 };
514
515 uint8_t m_Class;
516 uint8_t m_Subclass;
517
518 bool operator==( const LAYER_INFO& ) const = default;
519};
520
521
528{
530 uint8_t m_SubType;
531 uint32_t m_Key;
532 uint32_t m_Next;
533 uint32_t m_Parent;
534 uint32_t m_Unknown1;
535
537
538 uint32_t m_Width;
539
540 int32_t m_StartX;
541 int32_t m_StartY;
542 int32_t m_EndX;
543 int32_t m_EndY;
544
545 double m_CenterX; // Center
546 double m_CenterY;
547 double m_Radius;
548
549 std::array<int32_t, 4> m_BoundingBoxCoords;
550};
551
552
558{
559 struct SUB_0x6C
560 {
561 uint32_t m_NumEntries;
562 std::vector<uint32_t> m_Entries;
563 };
564
566 {
567 uint16_t m_X0;
568 uint16_t m_X1;
569 std::vector<uint32_t> m_Entries;
570 };
571
572 struct SUB_0xF6
573 {
574 std::array<uint32_t, 20> m_Entries;
575 };
576
577 uint16_t m_Hdr1;
578
579 uint32_t m_Key;
580 uint32_t m_Next;
581
582
584
585 uint8_t m_SubType;
586 uint8_t m_Hdr2;
587 uint16_t m_Size;
588
590
591 std::variant<uint32_t, std::array<uint32_t, 2>, std::string, SUB_0x6C, SUB_0x70_0x74, SUB_0xF6> m_Substruct;
592};
593
607
608
615{
616 uint8_t m_Type;
617 uint16_t m_R;
618 uint32_t m_Key;
619 uint32_t m_Next;
620 uint32_t m_Net;
621 uint32_t m_ConnItem;
622
624};
625
626
655
656
662{
663 uint32_t m_Key;
664
665 // Pointer to the next BLK_0x06_COMPONENT
666 uint32_t m_Next;
667 // Pointer to COMP_DEVICE_TYPE string
669 // Pointer to SYM_NAME string
670 uint32_t m_SymbolName;
671 // Points to 0x07, first instance
673 // Points to 0x0F, function slot
675 // Points to 0x08, pin number
677
678 // Points to 0x03, first 'field'
679 uint32_t m_Fields;
680
682};
683
684
710
711
742
743
764
765
770{
771 uint8_t m_T;
773 uint32_t m_Key;
774 uint32_t m_Next;
775 uint32_t m_Unknown1;
776
778
779 std::array<int32_t, 4> m_Coords;
780 std::array<uint32_t, 4> m_Unknown4;
781 std::array<uint32_t, 5> m_Unknown5;
782
784};
785
786
792{
794 {
795 // These are in the same order as the pad shapes, at least for the 'simple' shapes
796 CIRCLE = 0x02,
797 OCTAGON = 0x03,
798 CROSS = 0x04,
799 SQUARE = 0x05,
800 RECTANGLE = 0x06,
801 DIAMOND = 0x07,
802 PENTAGON = 0x0a,
803 OBLONG_X = 0x0b,
804 OBLONG_Y = 0x0c,
805 HEXAGON_X = 0x0f,
806 HEXAGON_Y = 0x10,
807 TRIANGLE = 0x12,
808 };
809
810 uint8_t m_T;
812 uint32_t m_Key;
813 uint32_t m_Next;
814
815 uint32_t m_Unknown1;
816 uint32_t m_Unknown2;
817
821
825
826 uint32_t m_Unknown4;
827
829
830 std::array<int32_t, 2> m_Coords;
831 std::array<int32_t, 2> m_Size;
832
833 uint32_t m_GroupPtr;
834 uint32_t m_Unknown6;
835 uint32_t m_Unknown7;
836
838
839 uint32_t GetShape() const
840 {
841 return m_Shape16x.value_or( m_Shape.value_or( 0 ) );
842 }
843};
844
845
870
871
876{
877 uint8_t m_T;
879 uint32_t m_Key;
880 uint32_t m_Next;
881 uint32_t m_FpPtr;
882
883 uint32_t m_Unknown1;
884 uint32_t m_Unknown2;
885 uint32_t m_Unknown3;
886
889
890 std::array<int32_t, 4> m_Coords;
891
892 std::array<uint32_t, 3> m_UnknownArr;
894 uint32_t m_Rotation;
895};
896
897
904{
905 uint32_t m_Key;
906
907 uint32_t m_SlotName;
908
910
911 std::array<char, 32> m_CompDeviceType;
912
914
915 uint32_t m_Ptr0x06;
916 uint32_t m_Ptr0x11;
917
918 uint32_t m_Unknown2;
919
920 std::string GetCompDeviceTypeStr() const
921 {
922 // The string is stored as a fixed-length array, but is null-terminated
923 return std::string( m_CompDeviceType.data(), strnlen( m_CompDeviceType.data(), m_CompDeviceType.size() ) );
924 }
925};
926
927
934{
935 uint32_t m_Key;
936
938
940
942
943 uint32_t m_PtrX12;
944 uint32_t m_Unknown3;
946 uint32_t m_Slots; // 0x0F?
947 uint32_t m_Fields; // Presumably a pointer to a string
948};
949
950
970
971
989
990
1011
1012
1021{
1022 uint32_t m_Key;
1023 uint32_t m_Next;
1024 uint32_t m_Parent;
1025 uint32_t m_Flags;
1026
1028
1029 uint32_t m_Width;
1030
1031 int32_t m_StartX;
1032 int32_t m_StartY;
1033 int32_t m_EndX;
1034 int32_t m_EndY;
1035};
1036
1043{
1044 uint32_t m_Key;
1045 uint32_t m_Next;
1046 uint32_t m_NetName;
1047
1048 uint32_t m_Unknown1;
1049
1051
1052 uint32_t m_Type;
1053
1055 uint32_t m_Ratline;
1057 uint32_t m_FieldsPtr;
1059 uint32_t m_ModelPtr;
1063};
1064
1065
1079
1080
1086{
1110
1111 uint8_t m_Type;
1115
1117
1118 // Pad size
1119 int32_t m_W;
1120 int32_t m_H;
1121
1122 // In rounded rectangles, this is the corner radius.
1123 // In chamfered rectangles, this is the chamfer size.
1125
1126 // This is the pad component offset
1127 int32_t m_X3;
1128 int32_t m_X4;
1129
1136 uint32_t m_StrPtr;
1137
1138 // In versions < 17.2, seems to be not present in the last entry.
1139 std::optional<uint32_t> m_Z2;
1140};
1141
1142
1151{
1153 {
1158 {
1160 // NPTHs seem to have this instead of 0x01
1161 // SMDs seems to have this or 0x01, no clear pattern identified
1163 };
1164
1165 uint32_t m_DrillSize;
1169 // Not sure these are in the right place but they're in here somewhere (usually zero)
1172
1173 // Drill char presumably somewhere in here - can cross-match with 0x0C PIN_DEF to find
1175 // Mask or enum of pad flags, including plating
1176 uint8_t m_Flags;
1177 // An ASCII char, or 0x00
1179 uint8_t m_D;
1180
1181 // Probably some kind of type:
1182 // 0x0000 for through-hole
1183 // 0x0002 for SMD
1184 // 0x0400 for slots
1185 uint16_t m_Unknown_1;
1186
1187 uint16_t m_ArrayNX;
1188 uint16_t m_ArrayNY;
1189
1191 // Also unsure if these are in the right place (all usually 0?)
1194
1197 uint32_t m_Unknown_2;
1198 uint32_t m_SlotX;
1199 uint32_t m_SlotY;
1200 uint32_t m_Unknown_3;
1201
1203 };
1204
1206 {
1211 {
1212 // Some through-holes have this, some don't
1215 };
1216
1217 // Presumably the same as the one in the v16x header
1219 uint32_t m_Unknown1; // 0?
1220 uint32_t m_Unknown2; // 0?
1221
1223
1224 // Not sure if this is really a substruct
1225 uint8_t m_A; // Only lower 4 bits (top 4 are type)
1226 uint8_t m_B;
1228 uint8_t m_Flags;
1229 uint8_t m_D;
1230
1231 uint32_t m_unknown3; // 1?
1232 uint32_t m_Unknown4; // 0?
1233
1234 uint16_t m_ArrayNX;
1235 uint16_t m_ArrayNY;
1237 uint16_t m_Unknown5; // 0?
1238
1239 // Again, these are tentatively placed, they're always zero so far,
1240 // so it's hard to say where they go.
1241 // Assuming they follow the v16x layout and come after the layer count
1244 uint32_t m_Unknown6a;
1245 uint32_t m_Unknown6b;
1246
1247 uint32_t m_DrillSize;
1250 uint32_t m_SlotX;
1251 uint32_t m_SlotY;
1252 uint32_t m_ToleranceTravelPos; // "TOLERANCE_TRAVEL" in BeagleBone_Black drill table
1254
1258 uint32_t m_DrillChars; // Presumably 4 drill chars
1259
1260 // Probably holds secondary drill parameters and other new V17.2 features
1261 std::array<uint32_t, 21> m_UnknownArr3;
1262
1263 // To check - this could be another component?
1265 };
1266
1268
1272 uint8_t m_N;
1274 uint32_t m_Key;
1275 uint32_t m_Next;
1276
1277 // The name of the padstack
1278 uint32_t m_PadStr;
1279
1280 // The header fields arevery different between v16x and v17.x+
1281 using HEADER = std::variant<HEADER_v16x, HEADER_v17x>;
1283
1309 {
1310 // V<172 verified slots
1314
1315 // V>=172 verified slots
1317 };
1318
1324 {
1325 // First slot: Antipad
1327 // Thermal relief shape
1329 // Pad shape
1330 PAD = 2,
1331 // Unsure what this layer component slot is
1332 // But I suspect it's keepout, as that was added in V172.
1334 };
1335
1348 std::vector<PADSTACK_COMPONENT> m_Components;
1349
1355
1362 std::vector<uint32_t> m_UnknownArrN;
1363
1364
1365 // Dispatch common properties to the header variant
1366 uint32_t GetDrillSize() const
1367 {
1368 if( std::holds_alternative<HEADER_v16x>( m_Header ) )
1369 {
1370 return std::get<HEADER_v16x>( m_Header ).m_DrillSize;
1371 }
1372 else if( std::holds_alternative<HEADER_v17x>( m_Header ) )
1373 {
1374 return std::get<HEADER_v17x>( m_Header ).m_DrillSize;
1375 }
1376 else
1377 {
1378 throw std::runtime_error( "Unknown header variant" );
1379 }
1380 }
1381
1382 uint32_t GetLayerCount() const
1383 {
1384 if( std::holds_alternative<HEADER_v16x>( m_Header ) )
1385 {
1386 return std::get<HEADER_v16x>( m_Header ).m_LayerCount;
1387 }
1388 else if( std::holds_alternative<HEADER_v17x>( m_Header ) )
1389 {
1390 return std::get<HEADER_v17x>( m_Header ).m_LayerCount;
1391 }
1392 else
1393 {
1394 throw std::runtime_error( "Unknown header variant" );
1395 }
1396 }
1397
1398 bool IsPlated() const
1399 {
1400 if( std::holds_alternative<HEADER_v17x>( m_Header ) )
1401 {
1402 return ( std::get<HEADER_v17x>( m_Header ).m_Flags & HEADER_v17x::PAD_FLAGS::FLAG_PLATED ) != 0;
1403 }
1404 else
1405 {
1406 return ( std::get<HEADER_v16x>( m_Header ).m_Flags & HEADER_v16x::PAD_FLAGS::FLAG_PLATED ) != 0;
1407 }
1408 }
1409};
1410
1411
1416{
1417 uint32_t m_Key;
1418 uint32_t m_Next;
1419 uint32_t m_NameStrKey;
1420 uint32_t m_FieldPtr;
1421 uint16_t m_SizeA;
1422 uint16_t m_SizeB;
1423
1429 std::vector<std::array<uint8_t, 56>> m_DataB;
1434 std::vector<std::array<uint8_t, 256>> m_DataA;
1435
1437};
1438
1439
1445{
1446 uint8_t m_Type;
1447 uint16_t m_T2;
1448 uint32_t m_Key;
1449 uint32_t m_Next;
1450
1451 // Versioning seems unsure here
1452 // At least it is in Kinoma (V_164)
1455
1456 uint32_t m_StrPtr;
1457 uint32_t m_Size;
1458
1459 std::string m_String;
1460
1462};
1463
1464
1469{
1470 uint32_t m_Key;
1471 uint32_t m_Next;
1472 uint32_t m_Unknown2;
1473 uint32_t m_Unknown3;
1474 uint32_t m_Unknown4;
1475 uint16_t m_Unknown5;
1476 uint16_t m_Size;
1477
1481 std::vector<uint8_t> m_Substruct;
1482};
1483
1484
1505
1512{
1513 uint8_t m_Type;
1514 uint16_t m_R;
1515 uint32_t m_Size;
1516 uint32_t m_Key;
1517
1523 std::vector<uint8_t> m_Data;
1524};
1525
1526
1531{
1532 uint8_t m_Type;
1533 uint16_t m_T2;
1534 uint32_t m_Key;
1535
1537
1538 std::array<uint32_t, 8> m_UnknownArray;
1539};
1540
1541
1546{
1547 uint8_t m_Type;
1549 uint32_t m_Key;
1550 uint32_t m_Next;
1551
1552 std::array<uint32_t, 2> m_Flags;
1553
1554 uint32_t m_Ptr1;
1555 uint32_t m_Ptr2;
1556 uint32_t m_Ptr3;
1557
1558 std::array<int32_t, 5> m_Coords;
1559
1560 std::array<uint32_t, 4> m_Unknown1;
1561
1563
1565};
1566
1567
1575{
1576 uint8_t m_Type;
1578 uint32_t m_Key;
1579 uint32_t m_Next;
1580 uint32_t m_Parent;
1581 uint32_t m_Unknown1;
1582
1584
1585 std::array<int32_t, 4> m_Coords;
1586
1587 uint32_t m_Ptr2;
1588
1589 uint32_t m_Unknown3;
1590 uint32_t m_Unknown4;
1592 uint32_t m_Rotation;
1593};
1594
1595
1614
1615
1625{
1626 std::vector<uint32_t> m_Refs;
1627};
1628
1629
1671
1672
1679{
1680 uint8_t m_Type;
1681 uint16_t m_T;
1682 uint32_t m_Key;
1683
1684 // Points to something in the header
1685 uint32_t m_Ptr1;
1686 uint32_t m_Ptr2;
1687
1688 uint32_t m_Null; // Null value
1689
1690 uint32_t m_Ptr3;
1691
1692 int32_t m_Coord1;
1693 int32_t m_Coord2;
1694
1696
1697 uint32_t m_Unknown1;
1698
1699 // Pointer to a string, e.g., "2" in R0603
1700 uint32_t m_PtrX30;
1701
1702 uint32_t m_Unknown2;
1703 uint32_t m_Unknown3;
1704 uint32_t m_Unknown4;
1705};
1706
1707
1734
1735
1742{
1743 uint32_t m_Key;
1744
1745 uint32_t m_FpStrRef;
1746 uint32_t m_Unknown1;
1747
1748 // Could these be signed?
1749 std::array<uint32_t, 4> m_Coords;
1750
1751 uint32_t m_Next;
1760
1763};
1764
1765
1821
1822
1831{
1833 uint8_t m_Layer; // 0 = top (F_Cu), 1 = bottom (B_Cu)
1835
1836 uint32_t m_Key;
1837
1838 uint32_t m_Next;
1839
1841
1842 // Unsure what 16x means
1844
1845 uint16_t m_Unknown2;
1846 uint16_t m_Unknown3;
1847
1849
1850 uint32_t m_Flags;
1851
1852 uint32_t m_Rotation;
1853 int32_t m_CoordX;
1854 int32_t m_CoordY;
1855
1856 // Presumably equivalent to m_InstRef16x
1858
1861 uint32_t m_TextPtr; // Points to 0x30
1862
1864 uint32_t m_AreasPtr;
1867
1868 uint32_t GetInstRef() const
1869 {
1870 return m_InstRef.value_or( m_InstRef16x.value_or( 0 ) );
1871 }
1872};
1873
1874
1894
1895
1900{
1901 uint8_t m_Type;
1902 uint16_t m_T2;
1903 uint32_t m_Key;
1904
1905 std::array<uint32_t, 6> m_UnknownArray;
1906};
1907
1908
1973
1974
2008
2009
2016{
2017 uint8_t m_Type;
2019 uint32_t m_Key;
2020 uint32_t m_Next;
2021 uint32_t m_NetPtr;
2022 uint32_t m_Flags;
2023
2025
2026 uint32_t m_NextInFp;
2027 uint32_t m_ParentFp;
2028 uint32_t m_Track;
2029 uint32_t m_PadPtr;
2030 uint32_t m_Ptr6;
2031 uint32_t m_Ratline;
2034
2036
2037 uint32_t m_NameText;
2038 uint32_t m_Ptr11;
2039
2040 std::array<int32_t, 4> m_Coords;
2041};
2042
2043
2076
2077
2096
2097
2103{
2104 uint8_t m_T2;
2105 uint16_t m_T3;
2106
2107 std::array<uint8_t, 120> m_Content;
2108};
2109
2110
2117{
2118 uint16_t m_Code;
2119 uint32_t m_Key;
2120 uint32_t m_Next;
2121
2123
2124 uint32_t m_NumItems;
2125 uint32_t m_Count;
2126 uint32_t m_LastIdx;
2127 uint32_t m_Unknown2;
2128
2130
2139
2146
2147 struct X05
2148 {
2149 std::array<uint8_t, 28> m_Unknown;
2150
2151 // This is in Nvidia Jetson (17.4), not in EVK BaseBoard (17.2)
2153 };
2154
2155 struct X06
2156 {
2157 uint16_t m_N;
2158 uint8_t m_R;
2159 uint8_t m_S;
2160 uint32_t m_Unknown1;
2161
2163 };
2164
2166 {
2167 uint32_t m_A;
2168 uint32_t m_B;
2170 uint32_t m_CharWidth;
2171
2173
2175 uint32_t m_LineSpace;
2176 uint32_t m_Unknown3; // Always 0?
2177 uint32_t m_StrokeWidth; // Aka "photo width"
2178
2180 };
2181
2182 struct X0B
2183 {
2184 std::array<uint8_t, 1016> m_Unknown;
2185 };
2186
2187 struct X0C
2188 {
2189 std::array<uint8_t, 232> m_Unknown;
2190 };
2191
2192 struct X0D
2193 {
2194 std::array<uint8_t, 200> m_Unknown;
2195 };
2196
2197 struct X0F
2198 {
2199 uint32_t m_Key;
2200 std::array<uint32_t, 3> m_Ptrs;
2201 uint32_t m_Ptr2;
2202 };
2203
2204 struct X10
2205 {
2206 std::array<uint8_t, 108> m_Unknown;
2207
2208 // V18 has an extra uint32 "somewhere" in this block
2210 };
2211
2212 // So far only seen in a V175 file (Jetson)
2213 struct X12
2214 {
2215 // No point reading this before we can use it
2216 // std::array<uint8_t, 1052> m_Unknown;
2217 };
2218
2219 using SubstructVariant = std::variant<X02, X03, X05, X06, FontDef_X08, X0B, X0C, X0D, X0F, X10, X12>;
2220
2221 std::vector<SubstructVariant> m_Items;
2222};
2223
2224
2231{
2232 uint8_t m_T;
2233 uint16_t m_T2;
2234 uint32_t m_Key;
2235 uint32_t m_GroupPtr;
2236 uint32_t m_Next;
2237 uint32_t m_Capacity;
2238 uint32_t m_Count;
2239 uint32_t m_Unknown2;
2240
2242
2243 std::array<uint32_t, 100> m_Ptrs;
2244};
2245
2246
2265
2266
2271{
2272 uint32_t m_Key;
2273 uint32_t m_Parent;
2274 uint32_t m_Head;
2275
2276 // Array of 22 uint16_t values
2277 std::array<uint16_t, 22> m_X;
2278};
2279
2280
2293
2294
2300{
2301 uint8_t m_T;
2302 uint16_t m_SubType;
2303 uint32_t m_Len;
2304
2305 std::string m_Name;
2306 std::string m_Type;
2307
2308 uint32_t m_Unknown1;
2309 uint32_t m_Unknown2;
2310
2312
2313 std::string m_Value;
2314};
2315
2316
2322{
2323 uint8_t m_T;
2324 uint16_t m_T2;
2325 uint32_t m_Key;
2326
2328
2330 std::vector<uint32_t> m_Entries;
2331};
2332
2333
2338{
2339public:
2340 RAW_BOARD();
2341
2342 std::unique_ptr<FILE_HEADER> m_Header;
2343
2348
2353 std::unordered_map<uint32_t, std::string> m_StringTable;
2354
2355 // All the objects in the file
2356 std::vector<std::unique_ptr<BLOCK_BASE>> m_Objects;
2357
2358 // Map of keys to objects (for the objects we can get keys for)
2359 std::unordered_map<uint32_t, BLOCK_BASE*> m_ObjectKeyMap;
2360
2361 // Lists of the objects by type
2362 std::unordered_map<uint8_t, std::vector<BLOCK_BASE*>> m_ObjectLists;
2363
2364 static const size_t STRING_TABLE_OFFSET = 0x1200;
2365
2366 const BLOCK_BASE* GetObjectByKey( uint32_t aKey ) const
2367 {
2368 auto it = m_ObjectKeyMap.find( aKey );
2369 if( it != m_ObjectKeyMap.end() )
2370 return it->second;
2371 return nullptr;
2372 }
2373
2374 const std::string& GetString( uint32_t aId ) const
2375 {
2376 if( m_StringTable.count( aId ) )
2377 return m_StringTable.at( aId );
2378
2379 static const std::string empty;
2380 return empty;
2381 }
2382};
2383
2384} // namespace ALLEGRO
The base class for all blocks in the main body of an Allegro file.
uint32_t GetKey() const
virtual ~BLOCK_BASE()=default
uint8_t GetBlockType() const
BLOCK_BASE(uint8_t aBlockType, size_t aOffset)
BLOCK(uint8_t aBlockType, size_t aOffset)
const T & GetData() const
static bool empty(const wxTextEntryBase *aCtrl)
FIELD_KEYS
Hdr1 keys for field roles.
@ PHYS_CONSTRAINT_SET
Physical Constraint Set assignment.
@ NET_SCHEDULE
Net class/schedule assignment.
PAD_TYPE
The type of the padstack.
constexpr bool operator>=(FMT_VER lhs, FMT_VER rhs)
FMT_VER
The format of an Allego file.
Arc segment used in tracks, zone outlines, and shape boundaries.
std::array< int32_t, 4 > m_BoundingBoxCoords
uint8_t m_SubType
Bit 6 (0x40) = clockwise direction.
COND_GE< FMT_VER::V_172, uint32_t > m_Unknown6
std::array< uint32_t, 20 > m_Entries
Field/property references with variable-typed substructs.
COND_GE< FMT_VER::V_172, uint32_t > m_Unknown1
std::variant< uint32_t, std::array< uint32_t, 2 >, std::string, SUB_0x6C, SUB_0x70_0x74, SUB_0xF6 > m_Substruct
COND_GE< FMT_VER::V_172, uint32_t > m_Unknown2
Net assignment linking a net (0x1B) to its member objects.
COND_GE< FMT_VER::V_174, uint32_t > m_Unknown
Track segment container.
COND_GE< FMT_VER::V_172, uint32_t > m_Unknown5b
COND_GE< FMT_VER::V_172, uint32_t > m_Unknown5a
Component/symbol definitions.
COND_GE< FMT_VER::V_172, uint32_t > m_Unknown1
Component instance reference data.
COND_GE< FMT_VER::V_172, uint32_t > m_Unknown2
COND_LT< FMT_VER::V_172, uint32_t > m_Unknown4
COND_GE< FMT_VER::V_172, uint32_t > m_Unknown3
COND_GE< FMT_VER::V_172, uint32_t > m_UnknownPtr1
Pin number within a component.
COND_GE< FMT_VER::V_172, uint32_t > m_Previous
COND_LT< FMT_VER::V_172, uint32_t > m_StrPtr16x
COND_GE< FMT_VER::V_172, uint32_t > m_StrPtr
Pointer to 0x11 PIN_NAME object.
COND_GE< FMT_VER::V_172, uint32_t > m_Unknown1
0x0A objects represent DRC (Design Rule Check) elements.
std::array< uint32_t, 4 > m_Unknown4
std::array< int32_t, 4 > m_Coords
COND_GE< FMT_VER::V_172, uint32_t > m_Unknown2
COND_GE< FMT_VER::V_174, uint32_t > m_Unknown6
std::array< uint32_t, 5 > m_Unknown5
Pin definition with shape type, drill character, coordinates, and size.
COND_GE< FMT_VER::V_172, uint32_t > m_Unknown_16x
COND_GE< FMT_VER::V_180, uint32_t > m_Unknown5
COND_LT< FMT_VER::V_172, uint8_t > m_DrillChar
COND_GE_LT< FMT_VER::V_174, FMT_VER::V_180, uint32_t > m_Unknown8
COND_LT< FMT_VER::V_172, uint8_t > m_Shape
std::array< int32_t, 2 > m_Size
COND_GE< FMT_VER::V_172, uint32_t > m_DrillChars
COND_GE< FMT_VER::V_172, uint32_t > m_Shape16x
std::array< int32_t, 2 > m_Coords
COND_LT< FMT_VER::V_172, uint16_t > m_UnknownPadding
Pad geometry and placement in board-absolute coordinates.
uint32_t m_Rotation
Board-absolute millidegrees. Subtract footprint rotation for FP-local orientation.
COND_GE< FMT_VER::V_172, uint32_t > m_Unknown3
int32_t m_CoordsX
Board coordinates. Use SetFPRelativePosition() for KiCad FP-local space.
COND_GE< FMT_VER::V_174, uint32_t > m_Unknown1
int32_t m_CoordsY
Board coordinates. Use SetFPRelativePosition() for KiCad FP-local space.
COND_GE< FMT_VER::V_172, uint32_t > m_Unknown5
std::array< uint32_t, 3 > m_UnknownArr
uint32_t m_Rotation
Rotation in millidegrees.
COND_GE< FMT_VER::V_172, uint32_t > m_Unknown4
std::array< int32_t, 4 > m_Coords
Function slot in a multi-slot component (e.g.
COND_GE< FMT_VER::V_172, uint32_t > m_Next
std::array< char, 32 > m_CompDeviceType
COND_GE< FMT_VER::V_174, uint32_t > m_Unknown1
Function instance linking a component instance (0x07) to its schematic function, pin cross-references...
COND_GE< FMT_VER::V_174, uint32_t > m_Unknown2
COND_GE< FMT_VER::V_172, uint32_t > m_Unknown1
Pin name within a component, linked from function slots (0x0F).
uint32_t m_Key
Pointer to pin name string.
uint32_t m_PinNameStrPtr
Pointer to next 0x11 PIN_NAME object or 0x0F SLOT.
COND_GE< FMT_VER::V_174, uint32_t > m_Unknown2
uint32_t m_Next
Pointer to 0x08 PIN_NUMBER object.
Cross-reference between objects.
COND_GE< FMT_VER::V_165, uint32_t > m_Unknown2
COND_GE< FMT_VER::V_174, uint32_t > m_Unknown3
Graphics container holding a chain of line segments and arcs.
COND_GE< FMT_VER::V_172, uint32_t > m_Unknown2
0x15 , 0x16, 0x17 are segments:
COND_GE< FMT_VER::V_172, uint32_t > m_Unknown2
0x1B objects are nets.
uint32_t m_Ratline
Pointer to first 0x03 FIELD object or null.
COND_GE< FMT_VER::V_172, uint32_t > m_Unknown2
uint32_t m_MatchGroupPtr
Diff pair / match group pointer (0x26 or 0x2C)
PAD_FLAGS
Pad flags are founds in a byte of the pad info.
COND_GE< FMT_VER::V_165, uint32_t > m_Unknown_4
COND_GE< FMT_VER::V_180, std::array< uint32_t, 8 > > m_UnknownArr_v180
uint8_t m_Flags
Mask of PAD_FLAGS values.
PAD_FLAGS
Pad flags are founds in a byte of the pad info.
Padstack definition containing drill dimensions and a table of per-layer pad/antipad/thermal componen...
std::variant< HEADER_v16x, HEADER_v17x > HEADER
LAYER_COMP_SLOT
Component table layer offsets In the component table's layer section, each layer has 3 or 4 slots,...
std::vector< uint32_t > m_UnknownArrN
Some structure of m_N * 8 or 10:
size_t m_NumFixedCompEntries
How many of the entries are fixed roles (after this is n*layers)
uint8_t m_N
The number of something.
std::vector< PADSTACK_COMPONENT > m_Components
Collection of components that make up the padstack.
SLOTS
Fixed slot indices in the component table.
Physical constraint sets containing trace width, clearance, and routing rules.
uint32_t m_FieldPtr
Pointer to 0x03 FIELD with CS name (fallback when m_NameStrKey fails)
COND_GE< FMT_VER::V_172, uint32_t > m_Unknown4
uint32_t m_NameStrKey
String table key for constraint set name.
std::vector< std::array< uint8_t, 256 > > m_DataA
Records contain ASCII padstack/via name strings (null-terminated at offset 4) and file path reference...
std::vector< std::array< uint8_t, 56 > > m_DataB
Per-copper-layer dimension values, 14 x int32 per record.
uint32_t m_Next
Linked list next pointer (used by LL_WALKER)
Signal integrity and simulation model data (IBIS netlists).
COND_GE< FMT_VER::V_164, uint16_t > m_Unknown3
COND_GE< FMT_VER::V_172, uint32_t > m_Unknown4
uint32_t m_Next
Linked list next pointer (used by LL_WALKER)
COND_GE< FMT_VER::V_164, uint16_t > m_Unknown2
Per-padstack dimension records with name and value.
std::vector< uint8_t > m_Substruct
Version-dependent substruct holding padstack dimension name and value.
uint32_t m_Next
Linked list next pointer (used by LL_WALKER)
COND_GE< FMT_VER::V_174, std::array< uint32_t, 10 > > m_UnknownArray2
std::array< uint32_t, 7 > m_UnknownArray1
Headered data blob containing structured board data such as layer stackup definitions,...
std::vector< uint8_t > m_Data
An array of bytes that seems to be a variable length.
Purpose not determined.
COND_GE< FMT_VER::V_172, uint32_t > m_Unknown1
std::array< uint32_t, 8 > m_UnknownArray
0x23 objects represent ratlines.
COND_GE< FMT_VER::V_164, std::array< uint32_t, 4 > > m_Unknown2
std::array< uint32_t, 4 > m_Unknown1
COND_GE< FMT_VER::V_174, uint32_t > m_Unknown3
std::array< uint32_t, 2 > m_Flags
std::array< int32_t, 5 > m_Coords
Rectangle defined by four coordinates.
uint32_t m_Rotation
Rotation in millidegrees.
std::array< int32_t, 4 > m_Coords
COND_GE< FMT_VER::V_172, uint32_t > m_Unknown2
Match group indirection for differential pairs and match groups.
COND_GE< FMT_VER::V_172, uint32_t > m_Unknown1
uint32_t m_ConstPtr
Points to timing/delay constraints (field type 0x63), not physical constraints.
COND_GE< FMT_VER::V_174, uint32_t > m_Unknown2
Serialized Constraint Manager database containing secondary name table (V172+), material stackup,...
Polygon shape defined by a linked list of segments starting at m_FirstSegmentPtr (0x15/0x16/0x17 line...
COND_GE< FMT_VER::V_172, uint32_t > m_Unknown3
COND_GE< FMT_VER::V_172, uint32_t > m_Unknown2
std::array< int32_t, 4 > m_Coords
COND_LT< FMT_VER::V_172, uint32_t > m_TablePtr_16x
COND_GE< FMT_VER::V_172, uint32_t > m_TablePtr
0x29 objects may represent pins in .dra files.
std::string m_Name
uint32_t m_Properties
uint32_t m_Unknown
uint32_t mLayerNameId
Represents a list of layers.
COND_GE< FMT_VER::V_165, std::vector< REF_ENTRY > > m_RefEntries
COND_GE< FMT_VER::V_174, uint32_t > m_Unknown
COND_LT< FMT_VER::V_165, std::vector< NONREF_ENTRY > > m_NonRefEntries
Footprint definition (template) shared by multiple placed instances.
COND_GE< FMT_VER::V_164, uint32_t > m_Unknown2
COND_GE< FMT_VER::V_172, uint32_t > m_Unknown3
std::array< uint32_t, 4 > m_Coords
Lookup table used for named associations.
COND_LT< FMT_VER::V_172, uint32_t > m_Unknown4
COND_GE< FMT_VER::V_172, uint32_t > m_Unknown3
SUBTYPE
The subtype of a table.
@ SUBTYPE_0x102
Some kind of net match group.
@ SUBTYPE_GRAPHICAL_GROUP
Used for drill charts and x-section charts.
COND_GE< FMT_VER::V_172, uint32_t > m_Unknown2
COND_GE< FMT_VER::V_172, uint32_t > m_Unknown1
Placed footprint instance on the board.
uint32_t m_Rotation
Millidegrees (divide by 1000 for degrees)
COND_LT< FMT_VER::V_172, uint32_t > m_InstRef16x
COND_GE< FMT_VER::V_172, uint32_t > m_InstRef
COND_GE< FMT_VER::V_172, uint32_t > m_Unknown1
COND_GE< FMT_VER::V_172, uint32_t > m_Unknown4
Connection point at a track junction or pad-to-track transition.
COND_GE< FMT_VER::V_172, uint32_t > m_Unknown3
Purpose not determined.
std::array< uint32_t, 6 > m_UnknownArray
Text object with position, rotation, layer, font properties, and alignment.
COND_GE< FMT_VER::V_172, uint32_t > m_Unknown2
COND_GE< FMT_VER::V_172, TEXT_PROPERTIES > m_Font
COND_LT< FMT_VER::V_172, uint32_t > m_PtrGroup_16x
COND_GE< FMT_VER::V_172, uint32_t > m_PtrGroup_17x
COND_GE< FMT_VER::V_172, uint32_t > m_Unknown1
COND_GE< FMT_VER::V_172, uint32_t > m_Ptr2
COND_LT< FMT_VER::V_172, uint32_t > m_Unknown4
COND_GE< FMT_VER::V_172, uint32_t > m_Ptr1
COND_GE< FMT_VER::V_174, uint32_t > m_Unknown3
COND_LT< FMT_VER::V_172, TEXT_PROPERTIES > m_Font16x
String graphic content holding the actual text value and its display layer category.
COND_GE< FMT_VER::V_174, uint32_t > m_Un2
Placed pad instance linking a pad definition (0x0D via m_PadPtr) to its parent footprint (m_ParentFp)...
COND_GE< FMT_VER::V_172, uint32_t > m_Unknown2
std::array< int32_t, 4 > m_Coords
COND_GE< FMT_VER::V_172, uint32_t > m_Prev
Via instance with board position, padstack reference (m_Padstack for drill/annular ring definitions),...
COND_GE< FMT_VER::V_172, uint32_t > m_Unknown3
COND_GE< FMT_VER::V_172, uint32_t > m_UnknownPtr2
std::array< int32_t, 4 > m_BoundingBoxCoords
0x34 objects represent keepouts.
COND_GE< FMT_VER::V_172, uint32_t > m_Unknown1
File path references to Allegro log and report files (terminator.log, eclrpt.txt).
std::array< uint8_t, 120 > m_Content
COND_GE< FMT_VER::V_172, std::array< uint32_t, 8 > > m_Ys
COND_GE< FMT_VER::V_174, uint32_t > m_Unknown2
COND_GE< FMT_VER::V_172, std::array< uint32_t, 2 > > m_Zs
COND_GE< FMT_VER::V_164, std::array< uint32_t, 3 > > m_Ys
COND_GE< FMT_VER::V_172, std::string > m_Str
COND_GE< FMT_VER::V_174, uint32_t > m_Unknown1
COND_LT< FMT_VER::V_172, std::string > m_Str16x
std::array< uint8_t, 28 > m_Unknown
COND_GE< FMT_VER::V_174, uint32_t > m_Unknown2
COND_LT< FMT_VER::V_172, std::array< uint32_t, 50 > > m_Unknown2
std::array< uint8_t, 1016 > m_Unknown
std::array< uint8_t, 232 > m_Unknown
std::array< uint8_t, 200 > m_Unknown
std::array< uint8_t, 108 > m_Unknown
COND_GE< FMT_VER::V_180, uint32_t > m_Unknown2
Heterogeneous definition table containing font metrics (FontDef_X08), layer name definitions (X03),...
std::variant< X02, X03, X05, X06, FontDef_X08, X0B, X0C, X0D, X0F, X10, X12 > SubstructVariant
COND_GE< FMT_VER::V_174, uint32_t > m_Unknown3
COND_GE< FMT_VER::V_172, uint32_t > m_Unknown1
std::vector< SubstructVariant > m_Items
Fixed-capacity pointer array (100 entries).
COND_GE< FMT_VER::V_174, uint32_t > m_Unknown3
std::array< uint32_t, 100 > m_Ptrs
0x38 objects represent films.
COND_GE< FMT_VER::V_166, uint32_t > m_Unknown2
std::array< uint32_t, 7 > m_UnknownArray1
COND_GE< FMT_VER::V_174, uint32_t > m_Unknown3
COND_GE< FMT_VER::V_166, uint32_t > m_LayerNameStr
COND_LT< FMT_VER::V_166, std::string > m_FilmName
0x39 objects represent a film layer list.
0x3A objects represent a list of films
COND_GE< FMT_VER::V_174, uint32_t > m_Unknown1
Named property with type and value strings.
COND_GE< FMT_VER::V_172, uint32_t > m_Unknown3
Ordered list of block keys.
COND_GE< FMT_VER::V_174, uint32_t > m_Unknown
std::vector< uint32_t > m_Entries
COND_FIELD_BASE & operator=(const T &value)
COND_FIELD_BASE & operator=(T &&value)
virtual bool exists(FMT_VER ver) const =0
Define this function in the derived class to determine if the field exists in the given version of th...
const T & value_or(const T &aDefault) const
This is a conditional field that only exists in versions of a file less than a certain version and gr...
constexpr bool exists(FMT_VER ver) const override
Define this function in the derived class to determine if the field exists in the given version of th...
This is a conditional field that only exists in versions of a file of or above a certain version.
constexpr bool exists(FMT_VER ver) const override
Define this function in the derived class to determine if the field exists in the given version of th...
This is a conditional field that only exists in versions of a file less than a certain version.
constexpr bool exists(FMT_VER ver) const override
Define this function in the derived class to determine if the field exists in the given version of th...
uint32_t m_LayerList0x2A
uint32_t m_A
This is apparently some kind of linked list that chains though subsets objects in the file.
Allegro files start with this header.
COND_GE< FMT_VER::V_180, LINKED_LIST > m_LL_V18_4
COND_GE< FMT_VER::V_180, uint32_t > m_Unknown2g_V18
COND_LT< FMT_VER::V_180, std::array< uint32_t, 7 > > m_Unknown2_preV18
COND_LT< FMT_VER::V_180, uint32_t > m_0x35_Start_preV18
COND_GE< FMT_VER::V_180, std::array< uint32_t, 9 > > m_Unknown5_V18
std::array< char, 60 > m_AllegroVersion
COND_GE< FMT_VER::V_180, LINKED_LIST > m_LL_V18_5
COND_GE< FMT_VER::V_180, uint32_t > m_0x35_Start_V18
COND_LT< FMT_VER::V_180, LINKED_LIST > m_LL_Unknown5_preV18
COND_GE< FMT_VER::V_180, LINKED_LIST > m_LL_V18_3
COND_LT< FMT_VER::V_180, uint32_t > m_Unknown7
std::array< LAYER_MAP_ENTRY, 25 > m_LayerMap
The layer maps is a list of groups of two numbers.
COND_GE< FMT_VER::V_180, uint32_t > m_Unknown2e_V18
std::array< uint32_t, 50 > m_Unknown9
COND_LT< FMT_VER::V_180, uint32_t > m_0x27_End_preV18
COND_GE< FMT_VER::V_180, LINKED_LIST > m_LL_Unknown5_V18
COND_GE< FMT_VER::V_180, uint32_t > m_0x27_End_V18
COND_GE< FMT_VER::V_180, uint32_t > m_0x35_End_V18
COND_GE< FMT_VER::V_180, LINKED_LIST > m_LL_V18_6
uint32_t Get_0x27_End() const
const LINKED_LIST & GetUnknown5() const
COND_LT< FMT_VER::V_180, std::array< uint32_t, 17 > > m_Unknown5_preV18
COND_LT< FMT_VER::V_180, uint32_t > m_Unknown3
COND_LT< FMT_VER::V_180, uint32_t > m_0x35_End_preV18
COND_GE< FMT_VER::V_180, LINKED_LIST > m_LL_V18_1
COND_LT< FMT_VER::V_180, uint32_t > m_StringCount_preV18
COND_GE< FMT_VER::V_180, uint32_t > m_StringCount_V18
uint32_t GetStringsCount() const
COND_GE< FMT_VER::V_180, uint32_t > m_Unknown2b_V18
COND_GE< FMT_VER::V_180, uint32_t > m_Unknown2d_V18
COND_GE< FMT_VER::V_180, LINKED_LIST > m_LL_V18_2
COND_GE< FMT_VER::V_180, uint32_t > m_Unknown2a_V18
SUBCLASS
The second byte in a CLASS:SUBCLASS pair.
bool operator==(const LAYER_INFO &) const =default
Substruct in a padstack object.
uint32_t m_StrPtr
Seems to point to various things:
COND_GE< FMT_VER::V_172, uint32_t > m_Unknown1
COND_GE< FMT_VER::V_172, int32_t > m_Z1
std::optional< uint32_t > m_Z2
const BLOCK_BASE * GetObjectByKey(uint32_t aKey) const
static const size_t STRING_TABLE_OFFSET
std::unordered_map< uint32_t, std::string > m_StringTable
The string map is a map of U32 ID to strings.
const std::string & GetString(uint32_t aId) const
std::unordered_map< uint32_t, BLOCK_BASE * > m_ObjectKeyMap
FMT_VER m_FmtVer
What version is this file?
std::vector< std::unique_ptr< BLOCK_BASE > > m_Objects
std::unique_ptr< FILE_HEADER > m_Header
std::unordered_map< uint8_t, std::vector< BLOCK_BASE * > > m_ObjectLists
0x33 VIA objects.
Definition allegro_db.h:878