#![cfg(test)]
use std::fs::File;
use libreda_oasis::*;
use libreda_db::prelude::{Chip, HierarchyEdit, HierarchyBase, PropertyValue};
fn test_read(test_name: &str) {
let mut f = File::open(format!("./tests/klayout_test_data/t{}.oas", test_name)).unwrap();
let mut layout = Chip::new();
let reader = OASISStreamReader::default();
let result = reader.read_layout(&mut f, &mut layout);
dbg!(&layout);
dbg!(&result);
assert!(result.is_ok());
}
#[test]
fn test2_cells() {
test_read("2.1");
test_read("2.2");
test_read("2.4");
}
#[test]
#[should_panic]
fn test2_3_cells() {
test_read("2.3"); }
#[test]
#[should_panic]
fn test2_5_cells() {
test_read("2.5"); }
#[test]
fn test3_texts() {
test_read("3.1");
}
#[test]
fn test4_rectangles() {
test_read("4.1");
}
#[test]
fn test5_polygons() {
test_read("5.1");
}
#[test]
fn test6_paths() {
test_read("6.1");
}
#[test]
fn test8_placements() {
test_read("8.1");
test_read("8.2");
}
#[test]
fn test11_properties() {
test_read("11.1");
test_read("11.2");
test_read("11.3");
test_read("11.4");
}
#[test]
fn test_load_std_cell() {
let filename = "INVX1_no_compression.oas";
dbg!(format!("./tests/data/{}", filename));
let mut f = File::open(format!("./tests/data/{}", filename)).unwrap();
let mut layout = Chip::new();
let result = OASISStreamReader::default()
.read_layout(&mut f, &mut layout);
dbg!(&layout);
dbg!(&result);
assert!(result.is_ok());
}
#[test]
fn test_load_and_store_std_cell() {
let filename = "INVX1_no_compression.oas";
dbg!(format!("./tests/data/{}", filename));
let mut f = File::open(format!("./tests/data/{}", filename)).unwrap();
let mut layout = Chip::new();
let result = OASISStreamReader::default()
.read_layout(&mut f, &mut layout);
dbg!(&result);
assert!(result.is_ok());
let filename = "INVX1_no_compression_out.oas";
dbg!(format!("./tests/data/{}", filename));
let mut f = File::create(format!("./tests/data/{}", filename)).unwrap();
let writer = OASISStreamWriter::default();
let write_result = writer.write_layout(&mut f, &layout);
dbg!(&write_result);
assert!(write_result.is_ok());
}
#[test]
fn test_load_and_store_hierarchical_cell() {
let filename = "three_cell_layout.oas";
dbg!(format!("./tests/data/{}", filename));
let mut f = File::open(format!("./tests/data/{}", filename)).unwrap();
let mut layout = Chip::new();
let result = OASISStreamReader::default()
.read_layout(&mut f, &mut layout);
dbg!(&result);
assert!(result.is_ok());
let filename = "three_cell_layout_out.oas";
dbg!(format!("./tests/data/{}", filename));
let mut f = File::create(format!("./tests/data/{}", filename)).unwrap();
let write_result = OASISStreamWriter::default()
.write_layout(&mut f, &layout);
dbg!(&write_result);
assert!(write_result.is_ok());
}
#[test]
fn test_load_layout_with_properties() {
let filename = "simple_with_properties.oas";
dbg!(format!("./tests/data/{}", filename));
let mut f = File::open(format!("./tests/data/{}", filename)).unwrap();
let mut layout = Chip::new();
let result = OASISStreamReader::default()
.read_layout(&mut f, &mut layout);
dbg!(&result);
assert!(result.is_ok());
let top_cell_name = layout.get_chip_property(&"S_TOP_CELL".into()).unwrap();
if let PropertyValue::String(name) = top_cell_name {
assert_eq!(name.as_str(), "TOP");
} else {
assert!(false);
}
}
#[test]
fn test_write_read_path() {
use libreda_db::prelude::*;
let mut layout = Chip::new();
layout.set_dbu(1);
let layer = layout.find_or_create_layer(1, 0);
let top_cell = layout.create_cell("TOP".into());
let path = Path::new_extended(vec![(0, 0), (1, 1)], 4, 3, 7);
layout.insert_shape(&top_cell, &layer, path.into());
let mut buffer = Vec::new();
OASISStreamWriter::default().
write_layout(&mut buffer, &layout).unwrap();
let mut layout2 = Chip::new();
OASISStreamReader::default().
read_layout(&mut buffer[..].as_ref(), &mut layout2).unwrap();
let mut paths2 = vec![];
layout2.for_each_shape(&layout2.cell_by_name("TOP").unwrap(), &layer,
|_id, g| paths2.push(g.clone()));
let mut paths1 = vec![];
layout.for_each_shape(&layout.cell_by_name("TOP").unwrap(), &layer,
|_id, g| paths1.push(g.clone()));
assert_eq!(paths2, paths1);
}