KiCad PCB EDA Suite
Loading...
Searching...
No Matches
test_pads_layer_mapper.cpp
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 The KiCad Developers, see AUTHORS.txt for contributors.
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 2
9 * of the License, or (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, you may find one here:
18 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
19 * or you may search the http://www.gnu.org website for the version 2 license,
20 * or you may write to the Free Software Foundation, Inc.,
21 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
22 */
23
28
30
32
33
38
39
40BOOST_FIXTURE_TEST_SUITE( PadsLayerMapper, PADS_LAYER_MAPPER_FIXTURE )
41
42
43BOOST_AUTO_TEST_CASE( CopperLayerType_TwoLayer )
44{
45 PADS_LAYER_MAPPER mapper;
46 mapper.SetCopperLayerCount( 2 );
47
48 // Layer 1 = Top
49 BOOST_CHECK( mapper.GetLayerType( 1 ) == PADS_LAYER_TYPE::COPPER_TOP );
50
51 // Layer 2 = Bottom (for 2-layer board)
52 BOOST_CHECK( mapper.GetLayerType( 2 ) == PADS_LAYER_TYPE::COPPER_BOTTOM );
53}
54
55
56BOOST_AUTO_TEST_CASE( CopperLayerType_FourLayer )
57{
58 PADS_LAYER_MAPPER mapper;
59 mapper.SetCopperLayerCount( 4 );
60
61 // Layer 1 = Top
62 BOOST_CHECK( mapper.GetLayerType( 1 ) == PADS_LAYER_TYPE::COPPER_TOP );
63
64 // Layer 2, 3 = Inner
65 BOOST_CHECK( mapper.GetLayerType( 2 ) == PADS_LAYER_TYPE::COPPER_INNER );
66 BOOST_CHECK( mapper.GetLayerType( 3 ) == PADS_LAYER_TYPE::COPPER_INNER );
67
68 // Layer 4 = Bottom
69 BOOST_CHECK( mapper.GetLayerType( 4 ) == PADS_LAYER_TYPE::COPPER_BOTTOM );
70}
71
72
73BOOST_AUTO_TEST_CASE( CopperLayerType_SixLayer )
74{
75 PADS_LAYER_MAPPER mapper;
76 mapper.SetCopperLayerCount( 6 );
77
78 BOOST_CHECK( mapper.GetLayerType( 1 ) == PADS_LAYER_TYPE::COPPER_TOP );
79 BOOST_CHECK( mapper.GetLayerType( 2 ) == PADS_LAYER_TYPE::COPPER_INNER );
80 BOOST_CHECK( mapper.GetLayerType( 3 ) == PADS_LAYER_TYPE::COPPER_INNER );
81 BOOST_CHECK( mapper.GetLayerType( 4 ) == PADS_LAYER_TYPE::COPPER_INNER );
82 BOOST_CHECK( mapper.GetLayerType( 5 ) == PADS_LAYER_TYPE::COPPER_INNER );
83 BOOST_CHECK( mapper.GetLayerType( 6 ) == PADS_LAYER_TYPE::COPPER_BOTTOM );
84}
85
86
97
98
112
113
114BOOST_AUTO_TEST_CASE( UnknownLayerType )
115{
116 PADS_LAYER_MAPPER mapper;
117 mapper.SetCopperLayerCount( 2 );
118
119 // Unknown layer numbers should return UNKNOWN
120 BOOST_CHECK( mapper.GetLayerType( 100 ) == PADS_LAYER_TYPE::UNKNOWN );
121 BOOST_CHECK( mapper.GetLayerType( 999 ) == PADS_LAYER_TYPE::UNKNOWN );
122}
123
124
125BOOST_AUTO_TEST_CASE( AutoMapCopper )
126{
127 PADS_LAYER_MAPPER mapper;
128 mapper.SetCopperLayerCount( 4 );
129
130 BOOST_CHECK_EQUAL( mapper.GetAutoMapLayer( 1 ), F_Cu );
131 BOOST_CHECK_EQUAL( mapper.GetAutoMapLayer( 4 ), B_Cu );
134}
135
136
150
151
152BOOST_AUTO_TEST_CASE( ParseLayerName_Silkscreen )
153{
154 PADS_LAYER_MAPPER mapper;
155
156 BOOST_CHECK( mapper.ParseLayerName( "Silkscreen Top" ) == PADS_LAYER_TYPE::SILKSCREEN_TOP );
157 BOOST_CHECK( mapper.ParseLayerName( "SILKSCREEN TOP" ) == PADS_LAYER_TYPE::SILKSCREEN_TOP );
158 BOOST_CHECK( mapper.ParseLayerName( "silkscreen top" ) == PADS_LAYER_TYPE::SILKSCREEN_TOP );
159 BOOST_CHECK( mapper.ParseLayerName( "SST" ) == PADS_LAYER_TYPE::SILKSCREEN_TOP );
160 BOOST_CHECK( mapper.ParseLayerName( "Top Silk" ) == PADS_LAYER_TYPE::SILKSCREEN_TOP );
161
162 BOOST_CHECK( mapper.ParseLayerName( "Silkscreen Bottom" ) == PADS_LAYER_TYPE::SILKSCREEN_BOTTOM );
163 BOOST_CHECK( mapper.ParseLayerName( "SSB" ) == PADS_LAYER_TYPE::SILKSCREEN_BOTTOM );
164}
165
166
167BOOST_AUTO_TEST_CASE( ParseLayerName_SolderMask )
168{
169 PADS_LAYER_MAPPER mapper;
170
171 BOOST_CHECK( mapper.ParseLayerName( "Solder Mask Top" ) == PADS_LAYER_TYPE::SOLDERMASK_TOP );
172 BOOST_CHECK( mapper.ParseLayerName( "SOLDERMASK TOP" ) == PADS_LAYER_TYPE::SOLDERMASK_TOP );
173 BOOST_CHECK( mapper.ParseLayerName( "SMT" ) == PADS_LAYER_TYPE::SOLDERMASK_TOP );
174 BOOST_CHECK( mapper.ParseLayerName( "Top Mask" ) == PADS_LAYER_TYPE::SOLDERMASK_TOP );
175
176 BOOST_CHECK( mapper.ParseLayerName( "Solder Mask Bottom" ) == PADS_LAYER_TYPE::SOLDERMASK_BOTTOM );
177 BOOST_CHECK( mapper.ParseLayerName( "SMB" ) == PADS_LAYER_TYPE::SOLDERMASK_BOTTOM );
178}
179
180
181BOOST_AUTO_TEST_CASE( ParseLayerName_Paste )
182{
183 PADS_LAYER_MAPPER mapper;
184
185 BOOST_CHECK( mapper.ParseLayerName( "Paste Top" ) == PADS_LAYER_TYPE::PASTE_TOP );
186 BOOST_CHECK( mapper.ParseLayerName( "Solder Paste Top" ) == PADS_LAYER_TYPE::PASTE_TOP );
187
188 BOOST_CHECK( mapper.ParseLayerName( "Paste Bottom" ) == PADS_LAYER_TYPE::PASTE_BOTTOM );
189}
190
191
192BOOST_AUTO_TEST_CASE( ParseLayerName_Assembly )
193{
194 PADS_LAYER_MAPPER mapper;
195
196 BOOST_CHECK( mapper.ParseLayerName( "Assembly Top" ) == PADS_LAYER_TYPE::ASSEMBLY_TOP );
197 BOOST_CHECK( mapper.ParseLayerName( "Top Assembly" ) == PADS_LAYER_TYPE::ASSEMBLY_TOP );
198 BOOST_CHECK( mapper.ParseLayerName( "ASSY TOP" ) == PADS_LAYER_TYPE::ASSEMBLY_TOP );
199
200 BOOST_CHECK( mapper.ParseLayerName( "Assembly Bottom" ) == PADS_LAYER_TYPE::ASSEMBLY_BOTTOM );
201}
202
203
204BOOST_AUTO_TEST_CASE( ParseLayerName_BoardOutline )
205{
206 PADS_LAYER_MAPPER mapper;
207
208 BOOST_CHECK( mapper.ParseLayerName( "Board Outline" ) == PADS_LAYER_TYPE::BOARD_OUTLINE );
209 BOOST_CHECK( mapper.ParseLayerName( "Board" ) == PADS_LAYER_TYPE::BOARD_OUTLINE );
210 BOOST_CHECK( mapper.ParseLayerName( "Outline" ) == PADS_LAYER_TYPE::BOARD_OUTLINE );
211}
212
213
214BOOST_AUTO_TEST_CASE( ParseLayerName_Copper )
215{
216 PADS_LAYER_MAPPER mapper;
217
218 // Pattern matching for copper layers
219 BOOST_CHECK( mapper.ParseLayerName( "Top" ) == PADS_LAYER_TYPE::COPPER_TOP );
220 BOOST_CHECK( mapper.ParseLayerName( "Layer 1" ) == PADS_LAYER_TYPE::COPPER_TOP );
221
222 BOOST_CHECK( mapper.ParseLayerName( "Bottom" ) == PADS_LAYER_TYPE::COPPER_BOTTOM );
223 BOOST_CHECK( mapper.ParseLayerName( "Bot" ) == PADS_LAYER_TYPE::COPPER_BOTTOM );
224
225 BOOST_CHECK( mapper.ParseLayerName( "Inner 1" ) == PADS_LAYER_TYPE::COPPER_INNER );
226 BOOST_CHECK( mapper.ParseLayerName( "Internal" ) == PADS_LAYER_TYPE::COPPER_INNER );
227 BOOST_CHECK( mapper.ParseLayerName( "Mid Layer" ) == PADS_LAYER_TYPE::COPPER_INNER );
228}
229
230
231BOOST_AUTO_TEST_CASE( ParseLayerName_Unknown )
232{
233 PADS_LAYER_MAPPER mapper;
234
235 BOOST_CHECK( mapper.ParseLayerName( "Random Name" ) == PADS_LAYER_TYPE::UNKNOWN );
236 BOOST_CHECK( mapper.ParseLayerName( "XYZ123" ) == PADS_LAYER_TYPE::UNKNOWN );
237}
238
239
240BOOST_AUTO_TEST_CASE( CustomLayerNameMapping )
241{
242 PADS_LAYER_MAPPER mapper;
243
244 // Add custom mapping
245 mapper.AddLayerNameMapping( "Custom Layer", PADS_LAYER_TYPE::DOCUMENTATION );
246
247 BOOST_CHECK( mapper.ParseLayerName( "Custom Layer" ) == PADS_LAYER_TYPE::DOCUMENTATION );
248 BOOST_CHECK( mapper.ParseLayerName( "CUSTOM LAYER" ) == PADS_LAYER_TYPE::DOCUMENTATION );
249}
250
251
252BOOST_AUTO_TEST_CASE( PermittedLayers )
253{
254 PADS_LAYER_MAPPER mapper;
255
256 // Copper layers should permit all copper
257 LSET copper_permitted = mapper.GetPermittedLayers( PADS_LAYER_TYPE::COPPER_TOP );
258 BOOST_CHECK( copper_permitted.Contains( F_Cu ) );
259 BOOST_CHECK( copper_permitted.Contains( B_Cu ) );
260 BOOST_CHECK( copper_permitted.Contains( In1_Cu ) );
261
262 // Silkscreen should permit silkscreen layers
264 BOOST_CHECK( silk_permitted.Contains( F_SilkS ) );
265 BOOST_CHECK( silk_permitted.Contains( B_SilkS ) );
266 BOOST_CHECK( !silk_permitted.Contains( F_Cu ) );
267
268 // Board outline should only permit Edge_Cuts
269 LSET outline_permitted = mapper.GetPermittedLayers( PADS_LAYER_TYPE::BOARD_OUTLINE );
270 BOOST_CHECK( outline_permitted.Contains( Edge_Cuts ) );
271 BOOST_CHECK( !outline_permitted.Contains( F_Cu ) );
272 BOOST_CHECK( !outline_permitted.Contains( F_SilkS ) );
273}
274
275
276BOOST_AUTO_TEST_CASE( BuildInputLayerDescriptions )
277{
278 PADS_LAYER_MAPPER mapper;
279 mapper.SetCopperLayerCount( 4 );
280
281 std::vector<PADS_LAYER_INFO> infos = {
282 { 1, "Top Copper", PADS_LAYER_TYPE::COPPER_TOP, true },
283 { 4, "Bottom Copper", PADS_LAYER_TYPE::COPPER_BOTTOM, true },
284 { 26, "Silkscreen Top", PADS_LAYER_TYPE::SILKSCREEN_TOP, false }
285 };
286
287 std::vector<INPUT_LAYER_DESC> descs = mapper.BuildInputLayerDescriptions( infos );
288
289 BOOST_CHECK_EQUAL( descs.size(), 3 );
290
291 BOOST_CHECK_EQUAL( descs[0].Name, wxT( "Top Copper" ) );
292 BOOST_CHECK_EQUAL( descs[0].AutoMapLayer, F_Cu );
293 BOOST_CHECK( descs[0].Required );
294
295 BOOST_CHECK_EQUAL( descs[1].Name, wxT( "Bottom Copper" ) );
296 BOOST_CHECK_EQUAL( descs[1].AutoMapLayer, B_Cu );
297 BOOST_CHECK( descs[1].Required );
298
299 BOOST_CHECK_EQUAL( descs[2].Name, wxT( "Silkscreen Top" ) );
300 BOOST_CHECK_EQUAL( descs[2].AutoMapLayer, F_SilkS );
301 BOOST_CHECK( !descs[2].Required );
302}
303
304
311
312
LSET is a set of PCB_LAYER_IDs.
Definition lset.h:37
bool Contains(PCB_LAYER_ID aLayer) const
See if the layer set contains a PCB layer.
Definition lset.h:63
Maps PADS layer numbers and names to KiCad layer IDs.
LSET GetPermittedLayers(PADS_LAYER_TYPE aType) const
Get the permitted KiCad layers for a given PADS layer type.
PADS_LAYER_TYPE ParseLayerName(const std::string &aLayerName) const
Parse a PADS layer name and return its type.
static constexpr int LAYER_ASSEMBLY_TOP
static constexpr int LAYER_SILKSCREEN_BOTTOM
static constexpr int LAYER_PASTE_TOP
static constexpr int LAYER_SILKSCREEN_TOP
PADS_LAYER_TYPE GetLayerType(int aPadsLayer) const
Parse a PADS layer number and return its type.
static constexpr int LAYER_SOLDERMASK_TOP
static constexpr int LAYER_ASSEMBLY_BOTTOM
PCB_LAYER_ID GetAutoMapLayer(int aPadsLayer, PADS_LAYER_TYPE aType=PADS_LAYER_TYPE::UNKNOWN) const
Get the suggested KiCad layer for a PADS layer.
static constexpr int LAYER_PAD_STACK_BOTTOM
Pad stack: Bottom copper.
static constexpr int LAYER_PAD_STACK_TOP
Pad stack: Top copper.
static constexpr int LAYER_PASTE_BOTTOM
static std::string LayerTypeToString(PADS_LAYER_TYPE aType)
Convert a layer type to a human-readable string.
void SetCopperLayerCount(int aLayerCount)
Set the total number of copper layers in the PADS design.
static constexpr int LAYER_PAD_STACK_INNER
Pad stack: Inner copper.
std::vector< INPUT_LAYER_DESC > BuildInputLayerDescriptions(const std::vector< PADS_LAYER_INFO > &aLayerInfos) const
Build a vector of INPUT_LAYER_DESC from parsed PADS layer information.
void AddLayerNameMapping(const std::string &aName, PADS_LAYER_TYPE aType)
Add or update a layer name to type mapping.
static constexpr int LAYER_SOLDERMASK_BOTTOM
@ Edge_Cuts
Definition layer_ids.h:112
@ F_Paste
Definition layer_ids.h:104
@ B_Mask
Definition layer_ids.h:98
@ B_Cu
Definition layer_ids.h:65
@ F_Mask
Definition layer_ids.h:97
@ B_Paste
Definition layer_ids.h:105
@ In2_Cu
Definition layer_ids.h:67
@ F_Fab
Definition layer_ids.h:119
@ F_SilkS
Definition layer_ids.h:100
@ In1_Cu
Definition layer_ids.h:66
@ B_SilkS
Definition layer_ids.h:101
@ F_Cu
Definition layer_ids.h:64
@ B_Fab
Definition layer_ids.h:118
BOOST_AUTO_TEST_CASE(HorizontalAlignment)
BOOST_AUTO_TEST_SUITE_END()
BOOST_AUTO_TEST_CASE(CopperLayerType_TwoLayer)
BOOST_CHECK_EQUAL(result, "25.4")