extern crate libreda_oasis;
extern crate libreda_db;
use std::fs::File;
use libreda_oasis::*;
use libreda_db::prelude::{Layout, WithProperties};
use std::rc::Rc;
fn test_read(test_name: &str) {
let mut f = File::open(format!("./tests/klayout_test_data/t{}.oas", test_name)).unwrap();
let mut layout = Layout::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 = Layout::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 = Layout::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 = Layout::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 = Layout::new();
let result = OASISStreamReader::default()
.read_layout(&mut f, &mut layout);
dbg!(&result);
assert!(result.is_ok());
let top_cell_name = layout.property_str("S_TOP_CELL").unwrap();
assert_eq!(top_cell_name.as_str(), "TOP");
let top = layout.cell_by_name("TOP").unwrap();
let sub = layout.cell_by_name("SUB").unwrap();
assert!(sub.property("name").is_some());
assert_eq!(sub.property_str("name").unwrap(), Rc::new("MySubCell1".to_string()));
for inst in top.each_inst() {
assert!(inst.property("name").is_some())
}
let layer = layout.find_layer(1, 0).unwrap();
for shape in sub.each_shape(layer) {
assert!(shape.property("name").is_some())
}
}
#[test]
fn test_write_read_path() {
use libreda_db::prelude::*;
let mut layout = Layout::new();
let layer = layout.find_or_create_layer(1, 0);
let top_cell = layout.create_and_get_cell(Some("TOP"));
let shapes = top_cell.shapes_get_or_create(layer);
shapes.insert(Path::new_extended(vec![(0, 0), (1, 1)], 4, 3, 7));
let mut buffer = Vec::new();
OASISStreamWriter::default().
write_layout(&mut buffer, &layout).unwrap();
let mut layout2 = Layout::new();
OASISStreamReader::default().
read_layout(&mut buffer[..].as_ref(), &mut layout2).unwrap();
let paths2: Vec<_> = layout2.cell_by_name("TOP").unwrap()
.each_shape(layer)
.map(|s| s.geometry.clone())
.collect();
let paths1: Vec<_> = layout.cell_by_name("TOP").unwrap()
.each_shape(layer)
.map(|s| s.geometry.clone())
.collect();
assert_eq!(paths2, paths1);
}