diff --git a/eeschema/sim/kibis/ibis_parser.cpp b/eeschema/sim/kibis/ibis_parser.cpp index 9e9b3d1066..d227faff1d 100644 --- a/eeschema/sim/kibis/ibis_parser.cpp +++ b/eeschema/sim/kibis/ibis_parser.cpp @@ -2,6 +2,7 @@ * This program source code file is part of KiCad, a free EDA CAD application. * * Copyright (C) 2022 Fabien Corona f.corona<at>laposte.net + * Copyright (C) 2023 KiCad Developers, see AUTHORS.txt for contributors. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: @@ -183,39 +184,57 @@ bool IbisComponentPin::Check() { std::stringstream message; message << _( "Checking pin " ) << m_pinName; - Report( message.str(), RPT_SEVERITY_ACTION ); if( m_pinName.empty() ) { + if(status ) + Report( message.str(), RPT_SEVERITY_ACTION ); + Report( _( "Pin name cannot be empty." ), RPT_SEVERITY_ERROR ); status = false; } if( m_signalName.empty() ) { + if(status ) + Report( message.str(), RPT_SEVERITY_ACTION ); + Report( _( "Signal name cannot be empty." ), RPT_SEVERITY_ERROR ); status = false; } if( m_modelName.empty() ) { + if(status ) + Report( message.str(), RPT_SEVERITY_ACTION ); + Report( _( "Model name cannot be empty." ), RPT_SEVERITY_ERROR ); status = false; } if( isnan( m_Rpin ) && !isNumberNA( m_Rpin ) ) { - Report( _( "Rpin is not valid." ), RPT_SEVERITY_ERROR ); + if(status ) + Report( message.str(), RPT_SEVERITY_ACTION ); + + Report( _( "Rpin is not valid." ), RPT_SEVERITY_ERROR ); status = false; } if( isnan( m_Lpin )&& !isNumberNA( m_Lpin ) ) { + if(status ) + Report( message.str(), RPT_SEVERITY_ACTION ); + Report( _( "Lpin is not valid." ), RPT_SEVERITY_ERROR ); status = false; } if( isnan( m_Cpin )&& !isNumberNA( m_Cpin ) ) { + if(status ) + Report( message.str(), RPT_SEVERITY_ACTION ); + Report( _( "Cpin is not valid." ), RPT_SEVERITY_ERROR ); status = false; } } + return status; } @@ -224,30 +243,41 @@ bool IbisComponent::Check() { bool status = true; + std::stringstream message; + message << _( "Checking component " ) << m_name; + if( m_name.empty() ) { - Report( _( "Component name cannot be empty." ), RPT_SEVERITY_ERROR ); + if( status ) + Report( message.str(), RPT_SEVERITY_ACTION ); + + Report( _( "Component name cannot be empty." ), RPT_SEVERITY_ERROR ); status = false; } - std::stringstream message; - message << _( "Checking component " ) << m_name; - Report( message.str(), RPT_SEVERITY_ACTION ); - if( m_manufacturer.empty() ) { + if( status ) + Report( message.str(), RPT_SEVERITY_ACTION ); + Report( _( "Component: manufacturer cannot be empty." ), RPT_SEVERITY_ERROR ); status = false; } if( !m_package.Check() ) { + if( status ) + Report( message.str(), RPT_SEVERITY_ACTION ); + Report( _( "Component: Invalid Package." ), RPT_SEVERITY_ERROR ); status = false; } if( m_pins.size() < 1 ) { + if( status ) + Report( message.str(), RPT_SEVERITY_ACTION ); + Report( _( "Component: no pin" ), RPT_SEVERITY_ERROR ); status = false; } @@ -443,51 +473,77 @@ bool IbisModel::Check() std::stringstream message; message << _( "Checking model " ) << m_name; - Report( message.str(), RPT_SEVERITY_ACTION ); if(m_type == IBIS_MODEL_TYPE::UNDEFINED) { + if( status ) + Report( message.str(), RPT_SEVERITY_ACTION ); + Report( _( "Undefined model type" ), RPT_SEVERITY_ERROR ); status = false; } if( isnan( m_vinh ) && !isNumberNA( m_vinh ) ) { + if( status ) + Report( message.str(), RPT_SEVERITY_ACTION ); + Report( _( "Invalid Vinh value." ), RPT_SEVERITY_ERROR ); status = false; } if( isnan( m_vinl ) && !isNumberNA( m_vinl ) ) { + if( status ) + Report( message.str(), RPT_SEVERITY_ACTION ); + Report( _( "Invalid Vinl value." ), RPT_SEVERITY_ERROR ); status = false; } if( isnan( m_rref ) && !isNumberNA( m_rref ) ) { + if( status ) + Report( message.str(), RPT_SEVERITY_ACTION ); + Report( _( "Invalid R_ref value." ), RPT_SEVERITY_ERROR ); status = false; } if( isnan( m_cref ) && !isNumberNA( m_cref ) ) { + if( status ) + Report( message.str(), RPT_SEVERITY_ACTION ); + Report( _( "Invalid C_ref value." ), RPT_SEVERITY_ERROR ); status = false; } if( isnan( m_vref ) && !isNumberNA( m_vref ) ) { + if( status ) + Report( message.str(), RPT_SEVERITY_ACTION ); + Report( _( "invalid V_ref value." ), RPT_SEVERITY_ERROR ); status = false; } if( isnan( m_vmeas ) && !isNumberNA( m_vmeas ) ) { + if( status ) + Report( message.str(), RPT_SEVERITY_ACTION ); + Report( _( "Invalid V_meas value." ), RPT_SEVERITY_ERROR ); status = false; } if( !m_C_comp.Check() ) { + if( status ) + Report( message.str(), RPT_SEVERITY_ACTION ); + Report( _( "C_comp is invalid." ), RPT_SEVERITY_ERROR ); status = false; } if( !m_temperatureRange.Check() ) { + if( status ) + Report( message.str(), RPT_SEVERITY_ACTION ); + Report( _( "Temperature Range is invalid." ), RPT_SEVERITY_ERROR ); status = false; } @@ -553,28 +609,41 @@ bool IbisHeader::Check() { bool status = true; - Report( _( "Checking Header..." ), RPT_SEVERITY_ACTION ); + std::stringstream message; + message << _( "Checking Header... " ); if( m_ibisVersion == -1 ) { + if(status ) + Report( message.str(), RPT_SEVERITY_ACTION ); + Report( _( "Missing [IBIS Ver]" ), RPT_SEVERITY_ERROR ); status = false; } if( m_ibisVersion > IBIS_MAX_VERSION ) { + if(status ) + Report( message.str(), RPT_SEVERITY_ACTION ); + Report( _( "The parser does not handle this IBIS version" ), RPT_SEVERITY_ERROR ); status = false; } if( m_fileRevision == -1 ) { + if(status ) + Report( message.str(), RPT_SEVERITY_ACTION ); + Report( _( "Missing [File Rev]" ), RPT_SEVERITY_ERROR ); status = false; } if( m_fileName.empty() ) { + if(status ) + Report( message.str(), RPT_SEVERITY_ACTION ); + Report( _( "Missing [File Name]" ), RPT_SEVERITY_ERROR ); status = false; } @@ -584,6 +653,9 @@ bool IbisHeader::Check() if( !( !strcmp( ext.c_str(), ".ibs" ) || !strcmp( ext.c_str(), ".pkg" ) || !strcmp( ext.c_str(), ".ebd" ) || !strcmp( ext.c_str(), ".ims" ) ) ) { + if(status ) + Report( message.str(), RPT_SEVERITY_ACTION ); + Report( "Invalid file extension in [File Name]", RPT_SEVERITY_ERROR ); status = false; } @@ -604,28 +676,39 @@ bool IbisPackageModel::Check() std::stringstream message; message << _( "Checking package model " ) << m_name; - Report( message.str(), RPT_SEVERITY_ACTION ); if( m_manufacturer.empty() ) { + if( status ) + Report( message.str(), RPT_SEVERITY_ACTION ); + Report( _( "Manufacturer cannot be empty." ), RPT_SEVERITY_ERROR ); status = false; } if( m_OEM.empty() ) { + if( status ) + Report( message.str(), RPT_SEVERITY_ACTION ); + Report( _( "OEM cannot be empty." ), RPT_SEVERITY_ERROR ); status = false; } if( m_numberOfPins < 0 ) { + if( status ) + Report( message.str(), RPT_SEVERITY_ACTION ); + Report( _( "Negative number of pins." ), RPT_SEVERITY_ERROR ); status = false; } if( (int)m_pins.size() != m_numberOfPins ) { + if( status ) + Report( message.str(), RPT_SEVERITY_ACTION ); + Report( "Number of pins does not match [Pin Numbers] size", RPT_SEVERITY_ERROR ); status = false; } @@ -634,6 +717,9 @@ bool IbisPackageModel::Check() { if( m_pins.at( i ).empty() ) { + if( status ) + Report( message.str(), RPT_SEVERITY_ACTION ); + Report( _( "Empty pin number" ), RPT_SEVERITY_ERROR ); status = false; } @@ -642,6 +728,9 @@ bool IbisPackageModel::Check() if( !( m_resistanceMatrix )->Check() ) { + if( status ) + Report( message.str(), RPT_SEVERITY_ACTION ); + Report( _( "Resistance matrix is incorrect" ), RPT_SEVERITY_ERROR ); status = false; } @@ -650,18 +739,27 @@ bool IbisPackageModel::Check() { if( m_capacitanceMatrix->m_type == IBIS_MATRIX_TYPE::UNDEFINED ) { + if( status ) + Report( message.str(), RPT_SEVERITY_ACTION ); + Report( _( "Capacitance matrix is undefined" ), RPT_SEVERITY_ERROR ); status = false; } if( !m_capacitanceMatrix->Check() ) { + if( status ) + Report( message.str(), RPT_SEVERITY_ACTION ); + Report( _( "Capacitance matrix is incorrect" ), RPT_SEVERITY_ERROR ); status = false; } } else { + if( status ) + Report( message.str(), RPT_SEVERITY_ACTION ); + Report( _( "Capacitance matrix is nullptr" ), RPT_SEVERITY_ERROR ); status = false; } @@ -670,18 +768,27 @@ bool IbisPackageModel::Check() { if( m_inductanceMatrix->m_type == IBIS_MATRIX_TYPE::UNDEFINED ) { + if( status ) + Report( message.str(), RPT_SEVERITY_ACTION ); + Report( _( "Inductance matrix is undefined" ), RPT_SEVERITY_ERROR ); status = false; } if( !m_inductanceMatrix->Check() ) { + if( status ) + Report( message.str(), RPT_SEVERITY_ACTION ); + Report( _( "Inductance matrix is incorrect" ), RPT_SEVERITY_ERROR ); status = false; } } else { + if( status ) + Report( message.str(), RPT_SEVERITY_ACTION ); + Report( _( "Inductance matrix is nullptr" ), RPT_SEVERITY_ERROR ); status = false; } @@ -703,10 +810,6 @@ bool IbisParser::ParseFile( std::string& aFileName ) return false; } - err_msg.clear(); - err_msg << _( "Reading file " ) << aFileName << wxT( "..." ); - Report( err_msg.str(), RPT_SEVERITY_ACTION ); - std::ostringstream ss; ss << ibisFile.rdbuf(); const std::string& s = ss.str(); diff --git a/eeschema/sim/sim_library.cpp b/eeschema/sim/sim_library.cpp index 3d0159851f..cf638469a9 100644 --- a/eeschema/sim/sim_library.cpp +++ b/eeschema/sim/sim_library.cpp @@ -29,7 +29,7 @@ std::unique_ptr<SIM_LIBRARY> SIM_LIBRARY::Create( const wxString& aFilePath, REPORTER* aReporter, - std::function<std::string( const std::string&, const std::string& )> *aResolver ) + std::function<std::string( const std::string&, const std::string& )> *aResolver ) { std::unique_ptr<SIM_LIBRARY> library; @@ -40,7 +40,8 @@ std::unique_ptr<SIM_LIBRARY> SIM_LIBRARY::Create( const wxString& aFilePath, REP library->m_reporter = aReporter; library->m_pathResolver = aResolver; - library->ReadFile( std::string( aFilePath.c_str() ), aReporter ); + library->ReadFile( aFilePath.utf8_string(), aReporter ); + return library; }