WIP: MALY reader, debugging, tests

This commit is contained in:
Matthias Koefferlein 2025-05-02 13:27:59 +02:00
parent 55e2b27bf6
commit 226ba429f1
22 changed files with 776 additions and 56 deletions

View File

@ -61,7 +61,7 @@ public:
/** /**
* @brief A class representing a title field on a mask * @brief A class representing a title field on a mask
*/ */
class MALYTitle class DB_PUBLIC MALYTitle
{ {
public: public:
/** /**
@ -138,7 +138,7 @@ public:
/** /**
* @brief A class representing a structure (pattern) on a mask * @brief A class representing a structure (pattern) on a mask
*/ */
class MALYStructure class DB_PUBLIC MALYStructure
{ {
public: public:
/** /**
@ -220,7 +220,7 @@ public:
/** /**
* @brief A class representing one mask * @brief A class representing one mask
*/ */
class MALYMask class DB_PUBLIC MALYMask
{ {
public: public:
/** /**
@ -261,7 +261,7 @@ public:
/** /**
* @brief A class representing the MALY file * @brief A class representing the MALY file
*/ */
class MALYData class DB_PUBLIC MALYData
{ {
public: public:
/** /**

View File

@ -165,7 +165,7 @@ MALYReader::import_data (db::Layout &layout, const MALYData &data)
} else { } else {
auto cbm = layout.cell_by_name (s->topcell.c_str ()); auto cbm = temp_layout.cell_by_name (s->topcell.c_str ());
if (! cbm.first) { if (! cbm.first) {
throw tl::Exception (tl::to_string (tr ("Mask pattern file '%s' does not have a cell named '%s' as required by mask '%s'")), s->path, s->topcell, m->name); throw tl::Exception (tl::to_string (tr ("Mask pattern file '%s' does not have a cell named '%s' as required by mask '%s'")), s->path, s->topcell, m->name);
} }
@ -174,27 +174,31 @@ MALYReader::import_data (db::Layout &layout, const MALYData &data)
} }
int source_layer = layout.get_layer_maybe (db::LayerProperties (s->layer, 0)); int source_layer = temp_layout.get_layer_maybe (db::LayerProperties (s->layer, 0));
if (source_layer >= 0) { if (source_layer >= 0) {
// create a host cell for the pattern // create a host cell for the pattern
std::string cn = m->name; std::string cn = m->name;
if (s->mname.empty ()) { if (s->topcell.empty ()) {
cn += ".PATTERN"; if (s->mname.empty ()) {
cn += ".PATTERN";
} else {
cn += "." + s->mname;
}
} else { } else {
cn += "." + s->mname; cn += "." + s->topcell;
} }
db::cell_index_type target_cell = layout.add_cell (cn.c_str ()); db::cell_index_type target_cell = layout.add_cell (cn.c_str ());
// create the pattern instance // create the pattern instance
db::ICplxTrans trans = db::CplxTrans (layout.dbu ()).inverted () * s->transformation * db::CplxTrans (temp_layout.dbu ()); db::ICplxTrans trans = db::CplxTrans (layout.dbu ()).inverted () * s->transformation * db::CplxTrans (layout.dbu ());
db::CellInstArray array; db::CellInstArray array;
if (s->nx > 1 || s->ny > 1) { if (s->nx > 1 || s->ny > 1) {
db::Coord idx = db::coord_traits<db::Coord>::rounded (s->dx / layout.dbu ()); db::Coord idx = db::coord_traits<db::Coord>::rounded (s->dx / layout.dbu ());
db::Coord idy = db::coord_traits<db::Coord>::rounded (s->dy / layout.dbu ()); db::Coord idy = db::coord_traits<db::Coord>::rounded (s->dy / layout.dbu ());
array = db::CellInstArray (target_cell, trans, db::Vector (idx, 0), db::Vector (0, idy), s->nx, s->ny); array = db::CellInstArray (target_cell, trans, trans.fp_trans () * db::Vector (idx, 0), trans.fp_trans () * db::Vector (0, idy), s->nx, s->ny);
} else { } else {
array = db::CellInstArray (target_cell, trans); array = db::CellInstArray (target_cell, trans);
} }
@ -277,6 +281,7 @@ MALYReader::read_record_internal ()
while (! m_stream.at_end () && (m_stream.get_char () != '*' || m_stream.peek_char () != '/')) while (! m_stream.at_end () && (m_stream.get_char () != '*' || m_stream.peek_char () != '/'))
; ;
if (m_stream.at_end ()) { if (m_stream.at_end ()) {
m_last_record_line = m_stream.line_number ();
error (tl::to_string (tr ("/*...*/ comment not closed"))); error (tl::to_string (tr ("/*...*/ comment not closed")));
} }
m_stream.get_char (); // eat trailing "/" m_stream.get_char (); // eat trailing "/"
@ -288,19 +293,25 @@ MALYReader::read_record_internal ()
} }
if (c == '\n') { if (c == '\n') {
if (m_stream.peek_char () == '+') { if (m_stream.peek_char () == '+') {
if (tl::Extractor (rec.c_str ()).at_end ()) {
m_last_record_line = m_stream.line_number ();
error (tl::to_string (tr ("'+' character at beginning of new record - did you mean to continue a line?")));
}
// continuation line // continuation line
m_stream.get_char (); // eat "+" m_stream.get_char (); // eat "+"
if (m_stream.at_end ()) { if (m_stream.at_end ()) {
break; break;
} }
c = m_stream.get_char ();
} else { } else {
break; break;
} }
}
if (c == '"' || c == '\'') { } else if (c == '"' || c == '\'') {
rec += c; rec += c;
@ -314,16 +325,19 @@ MALYReader::read_record_internal ()
break; break;
} else if (c == '\\') { } else if (c == '\\') {
if (m_stream.at_end ()) { if (m_stream.at_end ()) {
error (tl::to_string (tr ("Unexpected end of file inside quotee string"))); m_last_record_line = m_stream.line_number ();
error (tl::to_string (tr ("Unexpected end of file inside quoted string")));
} }
c = m_stream.get_char (); c = m_stream.get_char ();
rec += c; rec += c;
} else if (c == '\n') { } else if (c == '\n') {
m_last_record_line = m_stream.line_number ();
error (tl::to_string (tr ("Line break inside quoted string"))); error (tl::to_string (tr ("Line break inside quoted string")));
} }
} }
if (quote) { if (quote) {
m_last_record_line = m_stream.line_number ();
error (tl::to_string (tr ("Unexpected end of file inside quotee string"))); error (tl::to_string (tr ("Unexpected end of file inside quotee string")));
} }
@ -512,11 +526,14 @@ MALYReader::read_parameter (MALYReaderParametersData &data)
std::string format, path; std::string format, path;
ex.read_word_or_quoted (format); ex.read_word_or_quoted (format);
ex.read_word_or_quoted (path, ".\\/+-"); ex.read_word_or_quoted (path, ".\\/+-_");
ex.expect_end (); ex.expect_end ();
data.roots.push_back (std::make_pair (format, path)); data.roots.push_back (std::make_pair (format, path));
} else if (begin_section (ex)) {
warn (tl::to_string (tr ("Unknown section ignored")));
skip_section ();
} else { } else {
warn (tl::to_string (tr ("Unknown record ignored"))); warn (tl::to_string (tr ("Unknown record ignored")));
} }
@ -564,6 +581,9 @@ MALYReader::read_title (MALYReaderTitleData &data)
ex.expect_end (); ex.expect_end ();
} else if (begin_section (ex)) {
warn (tl::to_string (tr ("Unknown section ignored")));
skip_section ();
} else { } else {
warn (tl::to_string (tr ("Unknown record ignored"))); warn (tl::to_string (tr ("Unknown record ignored")));
} }
@ -639,6 +659,9 @@ MALYReader::read_strgroup (MALYReaderStrGroupData &data)
ex.expect_end (); ex.expect_end ();
} else if (begin_section (ex)) {
warn (tl::to_string (tr ("Unknown section ignored")));
skip_section ();
} else { } else {
warn (tl::to_string (tr ("Unknown record ignored"))); warn (tl::to_string (tr ("Unknown record ignored")));
} }
@ -674,6 +697,7 @@ MALYReader::read_mask (MALYReaderMaskData &mask)
read_strgroup (mask.strgroups.back ()); read_strgroup (mask.strgroups.back ());
} else if (begin_section (ex)) { } else if (begin_section (ex)) {
warn (tl::to_string (tr ("Unknown section ignored")));
skip_section (); skip_section ();
} else { } else {
warn (tl::to_string (tr ("Unknown record ignored"))); warn (tl::to_string (tr ("Unknown record ignored")));
@ -718,6 +742,9 @@ MALYReader::read_maskset (MALYData &data)
ex.expect_end (); ex.expect_end ();
read_mask (cmask); read_mask (cmask);
} else if (begin_section (ex)) {
warn (tl::to_string (tr ("Unknown section ignored")));
skip_section ();
} else { } else {
warn (tl::to_string (tr ("Unknown record ignored"))); warn (tl::to_string (tr ("Unknown record ignored")));
} }
@ -788,9 +815,9 @@ MALYReader::create_masks (const MALYReaderMaskData &cmask, const std::list<MALYR
warn (tl::to_string (tr ("No structure placement given - using 'center' for mask: ")) + m.name); warn (tl::to_string (tr ("No structure placement given - using 'center' for mask: ")) + m.name);
} }
MALYReaderParametersData::Base array_base = MALYReaderParametersData::BaseNotSet; MALYReaderParametersData::Base array_base = i->parameters.array_base;
if (array_base == MALYReaderParametersData::BaseNotSet) { if (array_base == MALYReaderParametersData::BaseNotSet) {
array_base = cmask.parameters.base; array_base = cmask.parameters.array_base;
} }
if (array_base == MALYReaderParametersData::BaseNotSet) { if (array_base == MALYReaderParametersData::BaseNotSet) {
array_base = MALYReaderParametersData::Center; array_base = MALYReaderParametersData::Center;

View File

@ -138,6 +138,13 @@ public:
*/ */
virtual void warn (const std::string &txt, int wl = 1); virtual void warn (const std::string &txt, int wl = 1);
/**
* @brief Reads the MALY file into a MALYData structure
*
* This method is provided for test purposes mainly.
*/
MALYData read_maly_file ();
private: private:
struct MALYReaderTitleSpec struct MALYReaderTitleSpec
{ {
@ -222,7 +229,6 @@ private:
std::list<std::string> m_sections; std::list<std::string> m_sections;
void import_data (db::Layout &layout, const MALYData &data); void import_data (db::Layout &layout, const MALYData &data);
MALYData read_maly_file ();
tl::Extractor read_record (); tl::Extractor read_record ();
void unget_record (); void unget_record ();
std::string read_record_internal (); std::string read_record_internal ();

View File

@ -24,6 +24,7 @@
#include "dbMALYReader.h" #include "dbMALYReader.h"
#include "dbLayoutDiff.h" #include "dbLayoutDiff.h"
#include "dbWriter.h" #include "dbWriter.h"
#include "dbTestSupport.h"
#include "tlUnitTest.h" #include "tlUnitTest.h"
#include <stdlib.h> #include <stdlib.h>
@ -54,7 +55,7 @@ static void run_test (tl::TestBase *_this, const std::string &base, const char *
options.set_options (opt); options.set_options (opt);
db::Manager m (false); db::Manager m (false);
db::Layout layout (&m), layout2 (&m), layout_au (&m); db::Layout layout (&m);
{ {
std::string fn (base); std::string fn (base);
@ -65,44 +66,74 @@ static void run_test (tl::TestBase *_this, const std::string &base, const char *
reader.read (layout, options); reader.read (layout, options);
} }
tl_assert (layout.begin_top_down () != layout.end_top_down ()); std::string fn_au (base);
std::string tc_name = layout.cell_name (*layout.begin_top_down ()); fn_au += "/maly/";
fn_au += file_au;
// normalize the layout by writing to OASIS and reading from .. db::compare_layouts (_this, layout, fn_au, db::WriteOAS);
std::string tmp_oas_file = _this->tmp_file (tl::sprintf ("%s.oas", tc_name));
{
tl::OutputStream stream (tmp_oas_file);
db::SaveLayoutOptions options;
options.set_format ("OASIS");
db::Writer writer (options);
writer.write (layout, stream);
}
{
tl::InputStream stream (tmp_oas_file);
db::Reader reader (stream);
reader.read (layout2);
}
{
std::string fn (base);
fn += "/maly/";
fn += file_au;
tl::InputStream stream (fn);
db::Reader reader (stream);
reader.read (layout_au);
}
bool equal = db::compare_layouts (layout2, layout_au, db::layout_diff::f_boxes_as_polygons | db::layout_diff::f_verbose | db::layout_diff::f_flatten_array_insts, 1);
if (! equal) {
_this->raise (tl::sprintf ("Compare failed after reading - see %s vs %s\n", tmp_oas_file, file_au));
}
} }
TEST(1) TEST(1_Basic)
{ {
run_test (_this, tl::testdata (), "MALY_TEST.maly", "mag_test_au.oas"); std::string fn (tl::testdata ());
fn += "/maly/MALY_test1.maly";
tl::InputStream stream (fn);
db::MALYReader reader (stream);
db::MALYData data = reader.read_maly_file ();
EXPECT_EQ (data.to_string (),
"Mask A\n"
" Size 127000\n"
" Title \"<SERIAL>\" m90 50,-50 1,1,1 [Standard]\n"
" Title \"<DATE>\" r0 0,-50 1,1,1 [Standard]\n"
" Title \"MaskA1\" r0 -50,50 1,1,1 [Standard]\n"
" Title \"WITH \"QUOTES\"\" m45 50,0 1,1,1 [Standard]\n"
" Ref A1.oas{CHIP_A}(1) (0,0;10,10) m90 *1 20,0\n"
" Ref A2.oas{CHIP_A}(2) ename(e001) dname(d001) (0,0;50,50) m90 *0.8 20,0 [2x5,1x2]\n"
" Ref B3.oas{CHIP_A}(2) (0,0;12,12) m90 *1 20,0"
)
}
static std::string run_test_with_error (tl::TestBase * /*_this*/, const std::string &file)
{
std::string fn (tl::testdata ());
fn += "/maly/";
fn += file;
tl::InputStream stream (fn);
db::MALYReader reader (stream);
try {
reader.read_maly_file ();
tl_assert (false);
} catch (tl::Exception &ex) {
tl::error << ex.msg ();
return ex.msg ();
}
}
TEST(2_Errors)
{
EXPECT_EQ (run_test_with_error (_this, "MALY_test2a.maly").find ("Line break inside quoted string (line=17,"), size_t (0));
EXPECT_EQ (run_test_with_error (_this, "MALY_test2b.maly").find ("/*...*/ comment not closed (line=43,"), size_t (0));
EXPECT_EQ (run_test_with_error (_this, "MALY_test2c.maly").find ("Expected value STANDARD or NATIVE for FONT (line=7,"), size_t (0));
EXPECT_EQ (run_test_with_error (_this, "MALY_test2d.maly").find ("Unknown base specification: NOVALIDBASE (line=8,"), size_t (0));
EXPECT_EQ (run_test_with_error (_this, "MALY_test2e.maly").find ("Expected end of text here: NOVALIDKEY .. (line=15,"), size_t (0));
EXPECT_EQ (run_test_with_error (_this, "MALY_test2f.maly").find ("Expected 'Y' or 'NONE' for MIRROR spec (line=15,"), size_t (0));
EXPECT_EQ (run_test_with_error (_this, "MALY_test2g.maly").find ("Expected end of text here: UNEXPECTED (line=20,"), size_t (0));
EXPECT_EQ (run_test_with_error (_this, "MALY_test2h.maly").find ("Expected value Y or NONE for MASKMIRROR (line=23,"), size_t (0));
EXPECT_EQ (run_test_with_error (_this, "MALY_test2i.maly").find ("Expected end of text here: UNEXPECTED (line=29,"), size_t (0));
EXPECT_EQ (run_test_with_error (_this, "MALY_test2j.maly").find ("Expected end of text here: NOVALIDKEY .. (line=30,"), size_t (0));
EXPECT_EQ (run_test_with_error (_this, "MALY_test2k.maly").find ("Expected a real number here: SCALE 0.80 .. (line=31,"), size_t (0));
EXPECT_EQ (run_test_with_error (_this, "MALY_test2l.maly").find ("Expected 'PARAMETER' here: CMASK (line=19,"), size_t (0));
EXPECT_EQ (run_test_with_error (_this, "MALY_test2m.maly").find ("Expected 'CMASK' here: TITLE (line=18,"), size_t (0));
EXPECT_EQ (run_test_with_error (_this, "MALY_test2n.maly").find ("Header expected ('BEGIN MALY') (line=2, "), size_t (0));
}
TEST(10_BasicLayout)
{
run_test (_this, tl::testdata (), "MALY_test10.maly", "maly_test10_au.oas");
} }

60
testdata/maly/MALY_test1.maly vendored Normal file
View File

@ -0,0 +1,60 @@
// A comment
/*
A multi-line comment
BEGIN MALY 1.1 -- not seend
*/
BEGIN MALY 1.1 // ignored
BEGIN MASKSET
BEGIN CMASK
AN UNKNOWN MASK RECORD
BEGIN NONSENSE
SOMETHING INSIDE A NONSENSE RECORD
BEGIN MORE
SOMETHING INSIDE ANOTHER NONSENSE RECORD
END MORE
END NONSENSE
BEGIN PARAMETER
MASKSIZE 5
FONT STANDARD
BASE ORIGIN
ARYBASE ORIGIN
ROOT OASIS.MASK /home/MASK
ROOT NATIVE "/home/NATIVE"
REFERENCE TOOL a.para
AN UNKNOWN PARAMETER
END PARAMETER
BEGIN TITLE
AN UNKNOWN TITLE RECORD
DATE 50.0 -50.0 MIRROR Y ROTATE 180
SERIAL 0 -50.0
STRING "WITH \"QUOTES\"" 50.0 0
+SIZE 1.0 1.0 1.0 MIRROR Y ROTATE 90
+// with a continuation line
END TITLE
END CMASK
BEGIN MASK A
BEGIN PARAMETER
ROOT OASIS.MASK /home/mask1
MASKMIRROR Y
END PARAMETER
BEGIN TITLE
DATE OFF
STRING MaskA1 -50.0 50.00
END TITLE
BEGIN STRGROUP G1
SREF A1.oas CHIP_A 1 ORG -20.0 0 SIZE 0.0 0.0 10.0 10.0
AREF A2.oas CHIP_A 2 ORG -20.0 0 SIZE 0.0 0.0 50.0 50.0
+ SCALE 0.800 ITERATION 5 2 2.0 1.0
PROPERTY DNAME d001 ENAME e001
END STRGROUP
BEGIN STRGROUP G2
SREF B3.oas CHIP_A 2 ORG -20.0 0.0 SIZE 0.0 0.0 12.0 12.0
END STRGROUP
END MASK
END MASKSET
END MALY
// A comment at the end

62
testdata/maly/MALY_test10.maly vendored Normal file
View File

@ -0,0 +1,62 @@
BEGIN MALY 1.1
BEGIN MASKSET
BEGIN CMASK
BEGIN PARAMETER
MASKSIZE 7
FONT STANDARD
BASE ORIGIN
ARYBASE ORIGIN
ROOT OASIS.MASK test10_oas
MASKMIRROR NONE
END PARAMETER
END CMASK
BEGIN MASK A
BEGIN STRGROUP G1
SREF pat.oas TOP 1 ORG -2000.0 0 SIZE -250.0 -250.0 1000.0 1000.0 SCALE 0.8
AREF pat.oas TOP 2 ORG 1000 0 SIZE -250.0 -250.0 1000.0 1000.0 SCALE 1.0 ITERATION 2 5 1500 2000
END STRGROUP
BEGIN STRGROUP G2
SREF pat.oas TOP 3 ORG -3000.0 2000 SIZE -250.0 -250.0 1000.0 1000.0 SCALE 2.0
END STRGROUP
END MASK
BEGIN MASK B
BEGIN PARAMETER
MASKMIRROR Y
END PARAMETER
BEGIN STRGROUP G1
SREF pat.oas TOP 1 ORG -2000.0 0 SIZE -250.0 -250.0 1000.0 1000.0 SCALE 0.8
AREF pat.oas TOP 2 ORG 1000 0 SIZE -250.0 -250.0 1000.0 1000.0 SCALE 1.0 ITERATION 2 5 1500 2000
END STRGROUP
BEGIN STRGROUP G2
SREF pat.oas TOP 3 ORG -3000.0 2000 SIZE -250.0 -250.0 1000.0 1000.0 SCALE 2.0
END STRGROUP
END MASK
BEGIN MASK C
BEGIN PARAMETER
ARYBASE LOWERLEFT
BASE LOWERLEFT
END PARAMETER
BEGIN STRGROUP G1
SREF pat.oas TOP 1 ORG -2000.0 0 SIZE -250.0 -250.0 1000.0 1000.0 SCALE 0.8
AREF pat.oas TOP 2 ORG 1000 0 SIZE -250.0 -250.0 1000.0 1000.0 SCALE 1.0 ITERATION 2 5 1500 2000
END STRGROUP
BEGIN STRGROUP G2
SREF pat.oas TOP 3 ORG -3000.0 2000 SIZE -250.0 -250.0 1000.0 1000.0 SCALE 2.0
END STRGROUP
END MASK
BEGIN MASK D
BEGIN PARAMETER
ARYBASE CENTER
BASE CENTER
END PARAMETER
BEGIN STRGROUP G1
SREF pat.oas TOP 1 ORG -2000.0 0 SIZE -250.0 -250.0 1000.0 1000.0 SCALE 0.8
AREF pat.oas TOP 2 ORG 1000 0 SIZE -250.0 -250.0 1000.0 1000.0 SCALE 1.0 ITERATION 2 5 1500 2000
END STRGROUP
BEGIN STRGROUP G2
SREF pat.oas TOP 3 ORG -3000.0 2000 SIZE -250.0 -250.0 1000.0 1000.0 SCALE 2.0
END STRGROUP
END MASK
END MASKSET
END MALY

View File

@ -14,7 +14,7 @@ BEGIN MALY 1.1
BEGIN TITLE BEGIN TITLE
DATE 50.0 -50.0 MIRROR Y ROTATE 180 DATE 50.0 -50.0 MIRROR Y ROTATE 180
SERIAL 0 -50.0 SERIAL 0 -50.0
STRING TEST 50.0 0 SIZE 1.0 1.0 1.0 MIRROR Y ROTATE 90 STRING "TEST\" 50.0 0 SIZE 1.0 1.0 1.0 MIRROR Y ROTATE 90
END TITLE END TITLE
END CMASK END CMASK
BEGIN MASK A BEGIN MASK A

42
testdata/maly/MALY_test2b.maly vendored Normal file
View File

@ -0,0 +1,42 @@
BEGIN MALY 1.1
BEGIN MASKSET
BEGIN CMASK
BEGIN PARAMETER
MASKSIZE 5
FONT STANDARD
BASE ORIGIN
ARYBASE ORIGIN
ROOT OASIS.MASK /home/MASK
ROOT NATIVE /home/NATIVE
REFERENCE TOOL a.para
END PARAMETER
BEGIN TITLE
DATE 50.0 -50.0 MIRROR Y ROTATE 180
SERIAL 0 -50.0
STRING "TEST" 50.0 0 SIZE 1.0 1.0 1.0 MIRROR Y ROTATE 90
/* not terminated
END TITLE
END CMASK
BEGIN MASK A
BEGIN PARAMETER
ROOT OASIS.MASK /home/mask1
MASKMIRROR Y
END PARAMETER
BEGIN TITLE
DATE OFF
STRING MaskA1 -50.0 50.00
END TITLE
BEGIN STRGROUP G1
SREF A1.oas CHIP_A 1 ORG -20.0 0 SIZE 0.0 0.0 10.0 10.0
AREF A2.oas CHIP_A 2 ORG -20.0 0 SIZE 0.0 0.0 50.0 50.0
+ SCALE 0.800 ITERATION 5 2 2.0 1.0
PROPERTY DNAME d001 ENAME e001
END STRGROUP
BEGIN STRGROUP G2
SREF B3.oas CHIP_A 2 ORG -20.0 0.0 SIZE 0.0 0.0 12.0 12.0
END STRGROUP
END MASK
END MASKSET
END MALY

41
testdata/maly/MALY_test2c.maly vendored Normal file
View File

@ -0,0 +1,41 @@
BEGIN MALY 1.1
BEGIN MASKSET
BEGIN CMASK
BEGIN PARAMETER
MASKSIZE 5
FONT NOVALIDFONT // wrong keyword
BASE ORIGIN
ARYBASE ORIGIN
ROOT OASIS.MASK /home/MASK
ROOT NATIVE /home/NATIVE
REFERENCE TOOL a.para
END PARAMETER
BEGIN TITLE
DATE 50.0 -50.0 MIRROR Y ROTATE 180
SERIAL 0 -50.0
STRING "TEST" 50.0 0 SIZE 1.0 1.0 1.0 MIRROR Y ROTATE 90
END TITLE
END CMASK
BEGIN MASK A
BEGIN PARAMETER
ROOT OASIS.MASK /home/mask1
MASKMIRROR Y
END PARAMETER
BEGIN TITLE
DATE OFF
STRING MaskA1 -50.0 50.00
END TITLE
BEGIN STRGROUP G1
SREF A1.oas CHIP_A 1 ORG -20.0 0 SIZE 0.0 0.0 10.0 10.0
AREF A2.oas CHIP_A 2 ORG -20.0 0 SIZE 0.0 0.0 50.0 50.0
+ SCALE 0.800 ITERATION 5 2 2.0 1.0
PROPERTY DNAME d001 ENAME e001
END STRGROUP
BEGIN STRGROUP G2
SREF B3.oas CHIP_A 2 ORG -20.0 0.0 SIZE 0.0 0.0 12.0 12.0
END STRGROUP
END MASK
END MASKSET
END MALY

41
testdata/maly/MALY_test2d.maly vendored Normal file
View File

@ -0,0 +1,41 @@
BEGIN MALY 1.1
BEGIN MASKSET
BEGIN CMASK
BEGIN PARAMETER
MASKSIZE 5
FONT STANDARD
BASE NOVALIDBASE // not a valid keyword
ARYBASE ORIGIN
ROOT OASIS.MASK /home/MASK
ROOT NATIVE /home/NATIVE
REFERENCE TOOL a.para
END PARAMETER
BEGIN TITLE
DATE 50.0 -50.0 MIRROR Y ROTATE 180
SERIAL 0 -50.0
STRING "TEST" 50.0 0 SIZE 1.0 1.0 1.0 MIRROR Y ROTATE 90
END TITLE
END CMASK
BEGIN MASK A
BEGIN PARAMETER
ROOT OASIS.MASK /home/mask1
MASKMIRROR Y
END PARAMETER
BEGIN TITLE
DATE OFF
STRING MaskA1 -50.0 50.00
END TITLE
BEGIN STRGROUP G1
SREF A1.oas CHIP_A 1 ORG -20.0 0 SIZE 0.0 0.0 10.0 10.0
AREF A2.oas CHIP_A 2 ORG -20.0 0 SIZE 0.0 0.0 50.0 50.0
+ SCALE 0.800 ITERATION 5 2 2.0 1.0
PROPERTY DNAME d001 ENAME e001
END STRGROUP
BEGIN STRGROUP G2
SREF B3.oas CHIP_A 2 ORG -20.0 0.0 SIZE 0.0 0.0 12.0 12.0
END STRGROUP
END MASK
END MASKSET
END MALY

41
testdata/maly/MALY_test2e.maly vendored Normal file
View File

@ -0,0 +1,41 @@
BEGIN MALY 1.1
BEGIN MASKSET
BEGIN CMASK
BEGIN PARAMETER
MASKSIZE 5
FONT STANDARD
BASE ORIGIN
ARYBASE ORIGIN
ROOT OASIS.MASK /home/MASK
ROOT NATIVE /home/NATIVE
REFERENCE TOOL a.para
END PARAMETER
BEGIN TITLE
DATE 50.0 -50.0 MIRROR Y ROTATE 180 NOVALIDKEYWORD
SERIAL 0 -50.0
STRING "TEST" 50.0 0 SIZE 1.0 1.0 1.0 MIRROR Y ROTATE 90
END TITLE
END CMASK
BEGIN MASK A
BEGIN PARAMETER
ROOT OASIS.MASK /home/mask1
MASKMIRROR Y
END PARAMETER
BEGIN TITLE
DATE OFF
STRING MaskA1 -50.0 50.00
END TITLE
BEGIN STRGROUP G1
SREF A1.oas CHIP_A 1 ORG -20.0 0 SIZE 0.0 0.0 10.0 10.0
AREF A2.oas CHIP_A 2 ORG -20.0 0 SIZE 0.0 0.0 50.0 50.0
+ SCALE 0.800 ITERATION 5 2 2.0 1.0
PROPERTY DNAME d001 ENAME e001
END STRGROUP
BEGIN STRGROUP G2
SREF B3.oas CHIP_A 2 ORG -20.0 0.0 SIZE 0.0 0.0 12.0 12.0
END STRGROUP
END MASK
END MASKSET
END MALY

41
testdata/maly/MALY_test2f.maly vendored Normal file
View File

@ -0,0 +1,41 @@
BEGIN MALY 1.1
BEGIN MASKSET
BEGIN CMASK
BEGIN PARAMETER
MASKSIZE 5
FONT STANDARD
BASE ORIGIN
ARYBASE ORIGIN
ROOT OASIS.MASK /home/MASK
ROOT NATIVE /home/NATIVE
REFERENCE TOOL a.para
END PARAMETER
BEGIN TITLE
DATE 50.0 -50.0 MIRROR NOVALIDSPEC ROTATE 180
SERIAL 0 -50.0
STRING "TEST" 50.0 0 SIZE 1.0 1.0 1.0 MIRROR Y ROTATE 90
END TITLE
END CMASK
BEGIN MASK A
BEGIN PARAMETER
ROOT OASIS.MASK /home/mask1
MASKMIRROR Y
END PARAMETER
BEGIN TITLE
DATE OFF
STRING MaskA1 -50.0 50.00
END TITLE
BEGIN STRGROUP G1
SREF A1.oas CHIP_A 1 ORG -20.0 0 SIZE 0.0 0.0 10.0 10.0
AREF A2.oas CHIP_A 2 ORG -20.0 0 SIZE 0.0 0.0 50.0 50.0
+ SCALE 0.800 ITERATION 5 2 2.0 1.0
PROPERTY DNAME d001 ENAME e001
END STRGROUP
BEGIN STRGROUP G2
SREF B3.oas CHIP_A 2 ORG -20.0 0.0 SIZE 0.0 0.0 12.0 12.0
END STRGROUP
END MASK
END MASKSET
END MALY

41
testdata/maly/MALY_test2g.maly vendored Normal file
View File

@ -0,0 +1,41 @@
BEGIN MALY 1.1
BEGIN MASKSET
BEGIN CMASK
BEGIN PARAMETER
MASKSIZE 5
FONT STANDARD
BASE ORIGIN
ARYBASE ORIGIN
ROOT OASIS.MASK /home/MASK
ROOT NATIVE /home/NATIVE
REFERENCE TOOL a.para
END PARAMETER
BEGIN TITLE
DATE 50.0 -50.0 MIRROR Y ROTATE 180
SERIAL 0 -50.0
STRING "TEST" 50.0 0 SIZE 1.0 1.0 1.0 MIRROR Y ROTATE 90
END TITLE
END CMASK
BEGIN MASK A UNEXPECTED
BEGIN PARAMETER
ROOT OASIS.MASK /home/mask1
MASKMIRROR Y
END PARAMETER
BEGIN TITLE
DATE OFF
STRING MaskA1 -50.0 50.00
END TITLE
BEGIN STRGROUP G1
SREF A1.oas CHIP_A 1 ORG -20.0 0 SIZE 0.0 0.0 10.0 10.0
AREF A2.oas CHIP_A 2 ORG -20.0 0 SIZE 0.0 0.0 50.0 50.0
+ SCALE 0.800 ITERATION 5 2 2.0 1.0
PROPERTY DNAME d001 ENAME e001
END STRGROUP
BEGIN STRGROUP G2
SREF B3.oas CHIP_A 2 ORG -20.0 0.0 SIZE 0.0 0.0 12.0 12.0
END STRGROUP
END MASK
END MASKSET
END MALY

41
testdata/maly/MALY_test2h.maly vendored Normal file
View File

@ -0,0 +1,41 @@
BEGIN MALY 1.1
BEGIN MASKSET
BEGIN CMASK
BEGIN PARAMETER
MASKSIZE 5
FONT STANDARD
BASE ORIGIN
ARYBASE ORIGIN
ROOT OASIS.MASK /home/MASK
ROOT NATIVE /home/NATIVE
REFERENCE TOOL a.para
END PARAMETER
BEGIN TITLE
DATE 50.0 -50.0 MIRROR Y ROTATE 180
SERIAL 0 -50.0
STRING "TEST" 50.0 0 SIZE 1.0 1.0 1.0 MIRROR Y ROTATE 90
END TITLE
END CMASK
BEGIN MASK A
BEGIN PARAMETER
ROOT OASIS.MASK /home/mask1
MASKMIRROR NOVALIDKEYWORD
END PARAMETER
BEGIN TITLE
DATE OFF
STRING MaskA1 -50.0 50.00
END TITLE
BEGIN STRGROUP G1
SREF A1.oas CHIP_A 1 ORG -20.0 0 SIZE 0.0 0.0 10.0 10.0
AREF A2.oas CHIP_A 2 ORG -20.0 0 SIZE 0.0 0.0 50.0 50.0
+ SCALE 0.800 ITERATION 5 2 2.0 1.0
PROPERTY DNAME d001 ENAME e001
END STRGROUP
BEGIN STRGROUP G2
SREF B3.oas CHIP_A 2 ORG -20.0 0.0 SIZE 0.0 0.0 12.0 12.0
END STRGROUP
END MASK
END MASKSET
END MALY

41
testdata/maly/MALY_test2i.maly vendored Normal file
View File

@ -0,0 +1,41 @@
BEGIN MALY 1.1
BEGIN MASKSET
BEGIN CMASK
BEGIN PARAMETER
MASKSIZE 5
FONT STANDARD
BASE ORIGIN
ARYBASE ORIGIN
ROOT OASIS.MASK /home/MASK
ROOT NATIVE /home/NATIVE
REFERENCE TOOL a.para
END PARAMETER
BEGIN TITLE
DATE 50.0 -50.0 MIRROR Y ROTATE 180
SERIAL 0 -50.0
STRING "TEST" 50.0 0 SIZE 1.0 1.0 1.0 MIRROR Y ROTATE 90
END TITLE
END CMASK
BEGIN MASK A
BEGIN PARAMETER
ROOT OASIS.MASK /home/mask1
MASKMIRROR Y
END PARAMETER
BEGIN TITLE
DATE OFF
STRING MaskA1 -50.0 50.00
END TITLE
BEGIN STRGROUP G1 UNEXPECTED
SREF A1.oas CHIP_A 1 ORG -20.0 0 SIZE 0.0 0.0 10.0 10.0
AREF A2.oas CHIP_A 2 ORG -20.0 0 SIZE 0.0 0.0 50.0 50.0
+ SCALE 0.800 ITERATION 5 2 2.0 1.0
PROPERTY DNAME d001 ENAME e001
END STRGROUP
BEGIN STRGROUP G2
SREF B3.oas CHIP_A 2 ORG -20.0 0.0 SIZE 0.0 0.0 12.0 12.0
END STRGROUP
END MASK
END MASKSET
END MALY

41
testdata/maly/MALY_test2j.maly vendored Normal file
View File

@ -0,0 +1,41 @@
BEGIN MALY 1.1
BEGIN MASKSET
BEGIN CMASK
BEGIN PARAMETER
MASKSIZE 5
FONT STANDARD
BASE ORIGIN
ARYBASE ORIGIN
ROOT OASIS.MASK /home/MASK
ROOT NATIVE /home/NATIVE
REFERENCE TOOL a.para
END PARAMETER
BEGIN TITLE
DATE 50.0 -50.0 MIRROR Y ROTATE 180
SERIAL 0 -50.0
STRING "TEST" 50.0 0 SIZE 1.0 1.0 1.0 MIRROR Y ROTATE 90
END TITLE
END CMASK
BEGIN MASK A
BEGIN PARAMETER
ROOT OASIS.MASK /home/mask1
MASKMIRROR Y
END PARAMETER
BEGIN TITLE
DATE OFF
STRING MaskA1 -50.0 50.00
END TITLE
BEGIN STRGROUP G1
SREF A1.oas CHIP_A 1 ORG -20.0 0 SIZE 0.0 0.0 10.0 10.0 NOVALIDKEYWORD
AREF A2.oas CHIP_A 2 ORG -20.0 0 SIZE 0.0 0.0 50.0 50.0
+ SCALE 0.800 ITERATION 5 2 2.0 1.0
PROPERTY DNAME d001 ENAME e001
END STRGROUP
BEGIN STRGROUP G2
SREF B3.oas CHIP_A 2 ORG -20.0 0.0 SIZE 0.0 0.0 12.0 12.0
END STRGROUP
END MASK
END MASKSET
END MALY

41
testdata/maly/MALY_test2k.maly vendored Normal file
View File

@ -0,0 +1,41 @@
BEGIN MALY 1.1
BEGIN MASKSET
BEGIN CMASK
BEGIN PARAMETER
MASKSIZE 5
FONT STANDARD
BASE ORIGIN
ARYBASE ORIGIN
ROOT OASIS.MASK /home/MASK
ROOT NATIVE /home/NATIVE
REFERENCE TOOL a.para
END PARAMETER
BEGIN TITLE
DATE 50.0 -50.0 MIRROR Y ROTATE 180
SERIAL 0 -50.0
STRING "TEST" 50.0 0 SIZE 1.0 1.0 1.0 MIRROR Y ROTATE 90
END TITLE
END CMASK
BEGIN MASK A
BEGIN PARAMETER
ROOT OASIS.MASK /home/mask1
MASKMIRROR Y
END PARAMETER
BEGIN TITLE
DATE OFF
STRING MaskA1 -50.0 50.00
END TITLE
BEGIN STRGROUP G1
SREF A1.oas CHIP_A 1 ORG -20.0 0 SIZE 0.0 0.0 10.0 10.0
AREF A2.oas CHIP_A 2 ORG -20.0 0 SIZE 0.0 0.0 50.0 // missing argument
+ SCALE 0.800 ITERATION 5 2 2.0 1.0
PROPERTY DNAME d001 ENAME e001
END STRGROUP
BEGIN STRGROUP G2
SREF B3.oas CHIP_A 2 ORG -20.0 0.0 SIZE 0.0 0.0 12.0 12.0
END STRGROUP
END MASK
END MASKSET
END MALY

41
testdata/maly/MALY_test2l.maly vendored Normal file
View File

@ -0,0 +1,41 @@
BEGIN MALY 1.1
BEGIN MASKSET
BEGIN CMASK
BEGIN PARAMETER
MASKSIZE 5
FONT STANDARD
BASE ORIGIN
ARYBASE ORIGIN
ROOT OASIS.MASK /home/MASK
ROOT NATIVE /home/NATIVE
REFERENCE TOOL a.para
// missing closing section END PARAMETER
BEGIN TITLE
DATE 50.0 -50.0 MIRROR Y ROTATE 180
SERIAL 0 -50.0
STRING "TEST" 50.0 0 SIZE 1.0 1.0 1.0 MIRROR Y ROTATE 90
END TITLE
END CMASK
BEGIN MASK A
BEGIN PARAMETER
ROOT OASIS.MASK /home/mask1
MASKMIRROR Y
END PARAMETER
BEGIN TITLE
DATE OFF
STRING MaskA1 -50.0 50.00
END TITLE
BEGIN STRGROUP G1
SREF A1.oas CHIP_A 1 ORG -20.0 0 SIZE 0.0 0.0 10.0 10.0
AREF A2.oas CHIP_A 2 ORG -20.0 0 SIZE 0.0 0.0 50.0 50.0
+ SCALE 0.800 ITERATION 5 2 2.0 1.0
PROPERTY DNAME d001 ENAME e001
END STRGROUP
BEGIN STRGROUP G2
SREF B3.oas CHIP_A 2 ORG -20.0 0.0 SIZE 0.0 0.0 12.0 12.0
END STRGROUP
END MASK
END MASKSET
END MALY

41
testdata/maly/MALY_test2m.maly vendored Normal file
View File

@ -0,0 +1,41 @@
BEGIN MALY 1.1
BEGIN MASKSET
BEGIN CMASK
BEGIN PARAMETER
MASKSIZE 5
FONT STANDARD
BASE ORIGIN
ARYBASE ORIGIN
ROOT OASIS.MASK /home/MASK
ROOT NATIVE /home/NATIVE
REFERENCE TOOL a.para
END PARAMETER
// missing opening BEGIN TITLE
DATE 50.0 -50.0 MIRROR Y ROTATE 180
SERIAL 0 -50.0
STRING "TEST" 50.0 0 SIZE 1.0 1.0 1.0 MIRROR Y ROTATE 90
END TITLE
END CMASK
BEGIN MASK A
BEGIN PARAMETER
ROOT OASIS.MASK /home/mask1
MASKMIRROR Y
END PARAMETER
BEGIN TITLE
DATE OFF
STRING MaskA1 -50.0 50.00
END TITLE
BEGIN STRGROUP G1
SREF A1.oas CHIP_A 1 ORG -20.0 0 SIZE 0.0 0.0 10.0 10.0
AREF A2.oas CHIP_A 2 ORG -20.0 0 SIZE 0.0 0.0 50.0 50.0
+ SCALE 0.800 ITERATION 5 2 2.0 1.0
PROPERTY DNAME d001 ENAME e001
END STRGROUP
BEGIN STRGROUP G2
SREF B3.oas CHIP_A 2 ORG -20.0 0.0 SIZE 0.0 0.0 12.0 12.0
END STRGROUP
END MASK
END MASKSET
END MALY

41
testdata/maly/MALY_test2n.maly vendored Normal file
View File

@ -0,0 +1,41 @@
BEGIN WRONG 1.1
BEGIN MASKSET
BEGIN CMASK
BEGIN PARAMETER
MASKSIZE 5
FONT STANDARD
BASE ORIGIN
ARYBASE ORIGIN
ROOT OASIS.MASK /home/MASK
ROOT NATIVE /home/NATIVE
REFERENCE TOOL a.para
END PARAMETER
BEGIN TITLE
DATE 50.0 -50.0 MIRROR Y ROTATE 180
SERIAL 0 -50.0
STRING "TEST" 50.0 0 SIZE 1.0 1.0 1.0 MIRROR Y ROTATE 90
END TITLE
END CMASK
BEGIN MASK A
BEGIN PARAMETER
ROOT OASIS.MASK /home/mask1
MASKMIRROR Y
END PARAMETER
BEGIN TITLE
DATE OFF
STRING MaskA1 -50.0 50.00
END TITLE
BEGIN STRGROUP G1
SREF A1.oas CHIP_A 1 ORG -20.0 0 SIZE 0.0 0.0 10.0 10.0
AREF A2.oas CHIP_A 2 ORG -20.0 0 SIZE 0.0 0.0 50.0 50.0
+ SCALE 0.800 ITERATION 5 2 2.0 1.0
PROPERTY DNAME d001 ENAME e001
END STRGROUP
BEGIN STRGROUP G2
SREF B3.oas CHIP_A 2 ORG -20.0 0.0 SIZE 0.0 0.0 12.0 12.0
END STRGROUP
END MASK
END MASKSET
END MALY

BIN
testdata/maly/maly_test10_au.oas vendored Normal file

Binary file not shown.

BIN
testdata/maly/test10_oas/pat.oas vendored Normal file

Binary file not shown.