use libreda_db::prelude as db;
use libreda_db::prelude::reference_access::*;
use libreda_db::prelude::CoordinateType;
use libreda_db::traits::*;
use std::collections::HashMap;
use super::export::LefDefExportError;
use super::lef_ast::{Shape, SignalUse, LEF};
use crate::lef_ast::Macro;
use num_traits::{NumCast, PrimInt};
#[derive(Clone)]
pub struct LEFExportOptions<C: L2NBase> {
pub layer_mapping: HashMap<C::LayerId, String>,
pub outline_layer: Option<C::LayerId>,
pub export_pins: bool,
pub overwrite_existing_macros: bool,
}
impl<C: L2NBase> Default for LEFExportOptions<C> {
fn default() -> Self {
Self {
layer_mapping: Default::default(),
outline_layer: None,
export_pins: true,
overwrite_existing_macros: false,
}
}
}
pub fn export_macro_to_lef<C, Crd>(
options: &LEFExportOptions<C>,
chip: &C,
macro_cell: &C::CellId,
lef: &mut LEF,
) -> Result<(), LefDefExportError>
where
Crd: NumCast + Ord + CoordinateType + PrimInt + std::fmt::Display,
C: L2NBase<Coord = Crd>,
{
let macro_name = chip.cell_name(macro_cell).into();
{
let macro_already_exists = lef.library.macros.contains_key(¯o_name);
if macro_already_exists & !options.overwrite_existing_macros {
return Err(LefDefExportError::NameAlreadyExists(macro_name));
}
}
let mut lef_macro = Macro::default();
lef_macro.name = macro_name.clone();
lef_macro.pins = todo!();
lef_macro.obs = todo!();
lef.library.macros.insert(macro_name, lef_macro);
Ok(())
}