增加对于 IP 的解析

This commit is contained in:
锦恢 2024-11-07 22:06:53 +08:00
parent 3a4bd0c7e4
commit cea86eb8f9
5 changed files with 93 additions and 45 deletions

View File

@ -303,6 +303,8 @@ pub struct Macro {
pub struct FastHdlparam {
#[serde(rename = "macro")]
pub fast_macro: Macro,
#[serde(rename = "fileType")]
pub file_type: String,
pub content: Vec<Module>
}

View File

@ -83,7 +83,10 @@ pub fn sv_parser(path: &str) -> Option<FastHdlparam> {
None
}
pub fn make_fast_from_syntaxtree(syntax_tree: &SyntaxTree, path: &PathBuf) -> Result<FastHdlparam, std::io::Error> {
pub fn make_fast_from_syntaxtree(
syntax_tree: &SyntaxTree,
path: &PathBuf
) -> Result<FastHdlparam, std::io::Error> {
// 对不同操作系统文件路径的支持
let path = to_escape_path(path);
@ -94,7 +97,8 @@ pub fn make_fast_from_syntaxtree(syntax_tree: &SyntaxTree, path: &PathBuf) -> Re
includes: get_includes(&path),
invalid: Vec::new()
},
content: Vec::new()
content: Vec::new(),
file_type: "common".to_string()
};
let mut ansi_port_last_dir = "";

View File

@ -17,7 +17,8 @@ pub fn vhdl_parser(path: &str) -> FastHdlparam {
includes: Vec::new(),
invalid: Vec::new()
},
content: Vec::new()
content: Vec::new(),
file_type: "common".to_string()
};
let parser = VHDLParser::new(VHDLStandard::VHDL2008);
@ -52,7 +53,8 @@ pub fn make_fast_from_design_file(design_file: &DesignFile) -> Option<FastHdlpar
includes: Vec::new(),
invalid: Vec::new()
},
content: Vec::new()
content: Vec::new(),
file_type: "common".to_string()
};
let mut all_tockens = Vec::new();

View File

@ -1,6 +1,6 @@
#![recursion_limit = "256"]
use request::{ CustomParamRequest, CustomRequest, DoFastApi, UpdateFastApi };
use request::{ CustomParamRequest, CustomRequest, DoFastApi };
use log::info;
use std::sync::Arc;
@ -46,7 +46,7 @@ async fn main() {
.custom_method("custom/request", CustomRequest)
.custom_method("custom/paramRequest", CustomParamRequest)
.custom_method("api/fast", DoFastApi)
.custom_method("api/update-fast", UpdateFastApi)
// .custom_method("api/update-fast", UpdateFastApi)
.finish();
Server::new(stdin, stdout, socket)

View File

@ -59,8 +59,11 @@ pub fn custom_param_request(param: String) -> Result<i32> {
#[derive(Deserialize, Serialize, Debug)]
#[serde(rename_all = "camelCase")]
pub struct DoFastApiRequestParams {
path: String,
file_type: String,
tool_chain: String
}
@ -73,7 +76,9 @@ impl <'a>tower_lsp::jsonrpc::Method<&'a Arc<Backend>, (DoFastApiRequestParams, )
fn invoke(&self, _server: &'a Arc<Backend>, _params: (DoFastApiRequestParams, )) -> Self::Future {
let request_param = _params.0;
let path = request_param.path;
let hdlparam = do_fast(path, _server);
let file_type = request_param.file_type;
let tool_chain = request_param.tool_chain;
let hdlparam = do_fast(path, file_type, tool_chain, _server);
future::ready(hdlparam)
}
}
@ -89,19 +94,35 @@ fn make_textdocumenitem_from_path(path_buf: &PathBuf) -> Option<TextDocumentItem
}
/// 前端交互接口: do_fast输入文件路径计算出对应的 fast 结构
pub fn do_fast(path: String, backend: &Arc<Backend>) -> Result<FastHdlparam> {
info!("parse fast \"{}\"", path);
pub fn do_fast(
path: String,
file_type: String,
tool_chain: String,
backend: &Arc<Backend>
) -> Result<FastHdlparam> {
info!("parse fast {:?}, type: {:?}, toolchain: {:?}", path, file_type, tool_chain);
// 根据 file_type 和 tool_chain 计算正确的 path
let path = {
if file_type == "ip" && tool_chain == "xilinx" {
let pathbuf = PathBuf::from_str(&path).unwrap();
let basename = pathbuf.file_name().unwrap().to_str().unwrap();
format!("{}/{}.vho", path, basename)
} else {
path
}
};
let language_id = get_language_id_by_path_str(&path);
let parse_fast_by_language_id = |language_id: &str| {
match language_id {
"vhdl" => {
do_vhdl_fast(&path, backend)
do_vhdl_fast(&path, &file_type, &tool_chain, backend)
}
"verilog" | "systemverilog" => {
do_sv_fast(&path, backend)
do_sv_fast(&path, &file_type, &tool_chain, backend)
}
_ => Err(tower_lsp::jsonrpc::Error {
@ -139,7 +160,14 @@ pub fn do_fast(path: String, backend: &Arc<Backend>) -> Result<FastHdlparam> {
}
}
fn do_sv_fast(path: &str, backend: &Arc<Backend>) -> Result<FastHdlparam> {
fn do_sv_fast(
path: &str,
#[allow(unused)]
file_type: &str,
#[allow(unused)]
tool_chain: &str,
backend: &Arc<Backend>
) -> Result<FastHdlparam> {
let path_buf = PathBuf::from(&path);
let doc = match make_textdocumenitem_from_path(&path_buf) {
@ -169,7 +197,8 @@ fn do_sv_fast(path: &str, backend: &Arc<Backend>) -> Result<FastHdlparam> {
let sources = &backend.server.srcs;
if let Some(syntax_tree) = parse_result {
if let Ok(fast) = make_fast_from_syntaxtree(&syntax_tree, &path_buf) {
if let Ok(mut fast) = make_fast_from_syntaxtree(&syntax_tree, &path_buf) {
fast.file_type = file_type.to_string();
let hdl_param = sources.hdl_param.clone();
hdl_param.update_fast(path.to_string(), fast.clone());
return Ok(fast);
@ -183,13 +212,24 @@ fn do_sv_fast(path: &str, backend: &Arc<Backend>) -> Result<FastHdlparam> {
})
}
fn do_vhdl_fast(path: &str, backend: &Arc<Backend>) -> Result<FastHdlparam> {
fn do_vhdl_fast(
path: &str,
#[allow(unused)]
file_type: &str,
#[allow(unused)]
tool_chain: &str,
backend: &Arc<Backend>
) -> Result<FastHdlparam> {
let sources = &backend.server.srcs;
let pathbuf = PathBuf::from_str(path).unwrap();
if let Some(design_file) = vhdl_parse(&pathbuf) {
let hdl_param = sources.hdl_param.clone();
if let Some(fast) = make_fast_from_design_file(&design_file) {
if let Some(mut fast) = make_fast_from_design_file(&design_file) {
fast.file_type = file_type.to_string();
hdl_param.update_fast(path.to_string(), fast.clone());
// if file_type == "ip" {
// info!("ip debug, path: {}, fast: {:#?}", path, fast);
// }
return Ok(fast);
}
}
@ -201,37 +241,37 @@ fn do_vhdl_fast(path: &str, backend: &Arc<Backend>) -> Result<FastHdlparam> {
})
}
#[derive(Clone)]
pub struct UpdateFastApi;
// #[derive(Clone)]
// pub struct UpdateFastApi;
impl <'a>tower_lsp::jsonrpc::Method<&'a Arc<Backend>, (DoFastApiRequestParams, ), Result<FastHdlparam>> for UpdateFastApi {
type Future = future::Ready<Result<FastHdlparam>>;
// impl <'a>tower_lsp::jsonrpc::Method<&'a Arc<Backend>, (DoFastApiRequestParams, ), Result<FastHdlparam>> for UpdateFastApi {
// type Future = future::Ready<Result<FastHdlparam>>;
fn invoke(&self, _server: &'a Arc<Backend>, _params: (DoFastApiRequestParams, )) -> Self::Future {
let request_param = _params.0;
let path = request_param.path;
let hdlparam = update_fast(path, _server);
future::ready(hdlparam)
}
}
// fn invoke(&self, _server: &'a Arc<Backend>, _params: (DoFastApiRequestParams, )) -> Self::Future {
// let request_param = _params.0;
// let path = request_param.path;
// let hdlparam = update_fast(path, _server);
// future::ready(hdlparam)
// }
// }
pub fn update_fast(path: String, backend: &Arc<Backend>) -> Result<FastHdlparam> {
{
let fast_sync_controller = backend.server.srcs.fast_sync_controller.read().unwrap();
if let Some(fast_lock) = fast_sync_controller.get(&path) {
let fast_lock = fast_lock.clone();
drop(fast_sync_controller);
let _unused = fast_lock.write().unwrap();
}
}
// pub fn update_fast(path: String, backend: &Arc<Backend>) -> Result<FastHdlparam> {
// {
// let fast_sync_controller = backend.server.srcs.fast_sync_controller.read().unwrap();
// if let Some(fast_lock) = fast_sync_controller.get(&path) {
// let fast_lock = fast_lock.clone();
// drop(fast_sync_controller);
// let _unused = fast_lock.write().unwrap();
// }
// }
// 去缓存中寻找
let hdl_param = backend.server.srcs.hdl_param.clone();
let path_to_hdl_file = hdl_param.path_to_hdl_file.read().unwrap();
if let Some(hdl_file) = path_to_hdl_file.get(&path) {
let fast = hdl_file.fast.clone();
Ok(fast)
} else {
do_fast(path, backend)
}
}
// // 去缓存中寻找
// let hdl_param = backend.server.srcs.hdl_param.clone();
// let path_to_hdl_file = hdl_param.path_to_hdl_file.read().unwrap();
// if let Some(hdl_file) = path_to_hdl_file.get(&path) {
// let fast = hdl_file.fast.clone();
// Ok(fast)
// } else {
// do_fast(path, backend)
// }
// }