using DotNext; using Newtonsoft.Json; using Newtonsoft.Json.Linq; namespace BsdlParser; /// /// [TODO:description] /// public class BoundaryScanRegs { /// /// [TODO:description] /// public class CellEntry { /// /// [TODO:description] /// [JsonProperty("cell_number")] [JsonRequired] public int CellNumber { get; set; } /// /// [TODO:description] /// [JsonProperty("cell_name")] [JsonRequired] public string CellName { get; set; } = "UnknownCellName"; /// /// [TODO:description] /// [JsonProperty("port_id")] public string? PortID { get; set; } /// /// [TODO:description] /// [JsonProperty("function")] [JsonRequired] public string? Function { get; set; } /// /// [TODO:description] /// [JsonProperty("safe_bit")] [JsonRequired] public string? SafeBit { get; set; } /// /// [TODO:description] /// [JsonProperty("ccell")] public string? CCell { get; set; } /// /// [TODO:description] /// [JsonProperty("disabel_value")] public string? DisableValue { get; set; } /// /// [TODO:description] /// [JsonProperty("disabel_result")] public string? DisableResult { get; set; } } /// /// [TODO:description] /// [JsonProperty("register_length")] [JsonRequired] public int RegisterLength { get; set; } /// /// [TODO:description] /// [JsonProperty("registers")] [JsonRequired] public CellEntry[] Registers { get; set; } = new CellEntry[] { }; } /// /// [TODO:description] /// public class Parser { private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); private const string BOUNDARY_REGS_DESP = "boundary_registers.json"; /// /// [TODO:description] /// public JObject BoundaryRegsDesp { get; } /// /// [TODO:description] /// /// [TODO:return] public Parser() { var filePath = Path.Combine(Environment.CurrentDirectory, BOUNDARY_REGS_DESP); if (!Path.Exists(filePath)) throw new Exception($"Counld not find boundary_registers.json in {filePath}"); this.BoundaryRegsDesp = JObject.Parse(File.ReadAllText(filePath)); } /// /// [TODO:description] /// public Optional GetBoundaryRegsNum() { var ret = this.BoundaryRegsDesp["register_length"]; if (ret is null) return new(); return Convert.ToInt32(ret); } /// /// [TODO:description] /// /// [TODO:return] public Optional> GetBoundaryPorts() { var registers = this.BoundaryRegsDesp["registers"]?.ToList(); if (registers is null) return new(); var cellList = new List(); foreach (var item in registers) { var cell = item.ToObject(); if (cell is null) return new(); cellList.Add(cell); } return cellList; } /// /// [TODO:description] /// /// [TODO:return] public Optional> GetBoundaryLogicalPorts() { var registers = this.BoundaryRegsDesp["registers"]?.ToList().Where((item) => { return item["port_id"] is not null; }); if (registers is null) return new(); var cellList = new List(); foreach (var item in registers) { var cell = item.ToObject(); if (cell is null) return new(); cellList.Add(cell); } return cellList; } // public Result GetLogicalPorts() // { // using (Py.GIL()) // { // using (PyModule scope = Py.CreateScope()) // { // string code = $@" // bsdl_parser = BsdlParser({this.filePath}) // result = json.dumps(bsdl_parser.GetLogicPortDesp(), indent=2) // "; // // var localVariables = new PyDict(); // scope.Exec(code, localVariables); // if (!localVariables.HasKey("result")) // return new(new Exception($"PythonNet doesn't has result from dict: {localVariables}")); // // var result = localVariables.GetItem("result"); // if (result is null) // return new(new Exception($"PythonNet get null from dict: {localVariables}")); // // var resultString = result.ToString(); // if (resultString is null) // return new(new Exception($"Pythonnet convert PyObject to string failed :{result}")); // return resultString; // } // } // } }