Merge pull request #1100 from KLayout/issue-1098

Issue 1098
This commit is contained in:
Matthias Köfferlein 2022-06-19 22:38:30 +02:00 committed by GitHub
commit 55cb6f72f9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 95 additions and 42 deletions

View File

@ -90,25 +90,51 @@ struct cell_inst_array_defs
}
}
static void normalize_array_arguments (const vector_type &a, const vector_type &b, unsigned long &na, unsigned long &nb)
{
if (na < 1 || a == vector_type ()) {
na = 1;
}
if (nb < 1 || b == vector_type ()) {
nb = 1;
}
}
static C *
new_cell_inst_array_vector (db::cell_index_type ci, const vector_type &v,
const vector_type &a, const vector_type &b, unsigned int na, unsigned int nb)
const vector_type &a, const vector_type &b, unsigned long na, unsigned long nb)
{
return new C (db::CellInst (ci), trans_type (v), a, b, na, nb);
normalize_array_arguments (a, b, na, nb);
if (na == 1 && nb == 1) {
// single instance
return new_cell_inst_vector (ci, v);
} else {
return new C (db::CellInst (ci), trans_type (v), a, b, na, nb);
}
}
static C *
new_cell_inst_array (db::cell_index_type ci, const trans_type &t,
const vector_type &a, const vector_type &b, unsigned int na, unsigned int nb)
const vector_type &a, const vector_type &b, unsigned long na, unsigned long nb)
{
return new C (db::CellInst (ci), t, a, b, na, nb);
normalize_array_arguments (a, b, na, nb);
if (na == 1 && nb == 1) {
// single instance
return new_cell_inst (ci, t);
} else {
return new C (db::CellInst (ci), t, a, b, na, nb);
}
}
static C *
new_cell_inst_array_cplx (db::cell_index_type ci, const complex_trans_type &t,
const vector_type &a, const vector_type &b, unsigned int na, unsigned int nb)
const vector_type &a, const vector_type &b, unsigned long na, unsigned long nb)
{
if (t.is_mag () || ! t.is_ortho ()) {
normalize_array_arguments (a, b, na, nb);
if (na == 1 && nb == 1) {
// single instance
return new_cell_inst_cplx (ci, t);
} else if (t.is_mag () || ! t.is_ortho ()) {
return new C (db::CellInst (ci), t, a, b, na, nb);
} else {
return new C (db::CellInst (ci), trans_type (t), a, b, na, nb);
@ -160,6 +186,23 @@ struct cell_inst_array_defs
return a;
}
static void reset_array_reg (C *arr, const vector_type &a, const vector_type &b, unsigned long na, unsigned long nb)
{
if (na > 0 && nb > 0) {
if (arr->is_complex ()) {
*arr = C (arr->object (), arr->complex_trans (), a, b, na, nb);
} else {
*arr = C (arr->object (), arr->front (), a, b, na, nb);
}
} else {
if (arr->is_complex ()) {
*arr = C (arr->object (), arr->complex_trans ());
} else {
*arr = C (arr->object (), arr->front ());
}
}
}
static void set_array_a (C *arr, const vector_type &a_in)
{
vector_type a, b;
@ -168,11 +211,7 @@ struct cell_inst_array_defs
a = a_in;
if (arr->is_complex ()) {
*arr = C (arr->object (), arr->complex_trans (), a, b, na, nb);
} else {
*arr = C (arr->object (), arr->front (), a, b, na, nb);
}
reset_array_reg (arr, a, b, na, nb);
}
static vector_type array_b (const C *arr)
@ -191,11 +230,7 @@ struct cell_inst_array_defs
b = b_in;
if (arr->is_complex ()) {
*arr = C (arr->object (), arr->complex_trans (), a, b, na, nb);
} else {
*arr = C (arr->object (), arr->front (), a, b, na, nb);
}
reset_array_reg (arr, a, b, na, nb);
}
static unsigned long array_na (const C *arr)
@ -214,19 +249,7 @@ struct cell_inst_array_defs
na = na_in;
if (na > 0 && nb > 0) {
if (arr->is_complex ()) {
*arr = C (arr->object (), arr->complex_trans (), a, b, na, nb);
} else {
*arr = C (arr->object (), arr->front (), a, b, na, nb);
}
} else {
if (arr->is_complex ()) {
*arr = C (arr->object (), arr->complex_trans ());
} else {
*arr = C (arr->object (), arr->front ());
}
}
reset_array_reg (arr, a, b, na, nb);
}
static unsigned long array_nb (const C *arr)
@ -245,19 +268,7 @@ struct cell_inst_array_defs
nb = nb_in;
if (na > 0 && nb > 0) {
if (arr->is_complex ()) {
*arr = C (arr->object (), arr->complex_trans (), a, b, na, nb);
} else {
*arr = C (arr->object (), arr->front (), a, b, na, nb);
}
} else {
if (arr->is_complex ()) {
*arr = C (arr->object (), arr->complex_trans ());
} else {
*arr = C (arr->object (), arr->front ());
}
}
reset_array_reg (arr, a, b, na, nb);
}
static void set_trans (C *arr, const trans_type &t)

View File

@ -387,6 +387,27 @@ class DBCellInst_TestClass < TestBase
ii.na = 0
assert_equal(ii.to_s, "#8 r270 0,0")
i = RBA::CellInstArray.new(0, RBA::Vector::new(1, 2), RBA::Vector::new(10, 20), RBA::Vector::new, 2, 2)
assert_equal(i.to_s, "#0 r0 1,2 [10,20*2;0,0*1]")
i = RBA::CellInstArray.new(0, RBA::Vector::new(1, 2), RBA::Vector::new(10, 20), RBA::Vector::new(11, 21), 2, 2)
assert_equal(i.to_s, "#0 r0 1,2 [10,20*2;11,21*2]")
i = RBA::CellInstArray.new(0, RBA::Vector::new(1, 2), RBA::Vector::new, RBA::Vector::new(11, 21), 2, 2)
assert_equal(i.to_s, "#0 r0 1,2 [0,0*1;11,21*2]")
i = RBA::CellInstArray.new(0, RBA::Vector::new(1, 2), RBA::Vector::new, RBA::Vector::new, 2, 2)
assert_equal(i.to_s, "#0 r0 1,2")
i = RBA::CellInstArray.new(0, RBA::Vector::new(1, 2), RBA::Vector::new(10, 20), RBA::Vector::new(11, 21), 0, 2)
assert_equal(i.to_s, "#0 r0 1,2 [10,20*1;11,21*2]")
i = RBA::CellInstArray.new(0, RBA::Vector::new(1, 2), RBA::Vector::new(10, 20), RBA::Vector::new(11, 21), 2, 0)
assert_equal(i.to_s, "#0 r0 1,2 [10,20*2;11,21*1]")
i = RBA::CellInstArray.new(0, RBA::Vector::new(1, 2), RBA::Vector::new(10, 20), RBA::Vector::new(11, 21), 0, 0)
assert_equal(i.to_s, "#0 r0 1,2")
end
# DCellInstArray functions
@ -459,6 +480,27 @@ class DBCellInst_TestClass < TestBase
ii.na = 0
assert_equal(ii.to_s, "#8 r270 0,0")
i = RBA::DCellInstArray.new(0, RBA::DVector::new(1, 2), RBA::DVector::new(10, 20), RBA::DVector::new, 2, 2)
assert_equal(i.to_s, "#0 r0 1,2 [10,20*2;0,0*1]")
i = RBA::DCellInstArray.new(0, RBA::DVector::new(1, 2), RBA::DVector::new(10, 20), RBA::DVector::new(11, 21), 2, 2)
assert_equal(i.to_s, "#0 r0 1,2 [10,20*2;11,21*2]")
i = RBA::DCellInstArray.new(0, RBA::DVector::new(1, 2), RBA::DVector::new, RBA::DVector::new(11, 21), 2, 2)
assert_equal(i.to_s, "#0 r0 1,2 [0,0*1;11,21*2]")
i = RBA::DCellInstArray.new(0, RBA::DVector::new(1, 2), RBA::DVector::new, RBA::DVector::new, 2, 2)
assert_equal(i.to_s, "#0 r0 1,2")
i = RBA::DCellInstArray.new(0, RBA::DVector::new(1, 2), RBA::DVector::new(10, 20), RBA::DVector::new(11, 21), 0, 2)
assert_equal(i.to_s, "#0 r0 1,2 [10,20*1;11,21*2]")
i = RBA::DCellInstArray.new(0, RBA::DVector::new(1, 2), RBA::DVector::new(10, 20), RBA::DVector::new(11, 21), 2, 0)
assert_equal(i.to_s, "#0 r0 1,2 [10,20*2;11,21*1]")
i = RBA::DCellInstArray.new(0, RBA::DVector::new(1, 2), RBA::DVector::new(10, 20), RBA::DVector::new(11, 21), 0, 0)
assert_equal(i.to_s, "#0 r0 1,2")
end
# DCellInstArray fuzzy compare