diff --git a/MPSoC/mutekh/arch/soclib/ldscript.cpp b/MPSoC/mutekh/arch/soclib/ldscript.cpp index 3f826cd44b03f75be2731519fe773338e7addd6b..2ad92939a27e3a9a72714dcd9c1388eaec5dfe9d 100644 --- a/MPSoC/mutekh/arch/soclib/ldscript.cpp +++ b/MPSoC/mutekh/arch/soclib/ldscript.cpp @@ -73,10 +73,14 @@ MEMORY mem_rom (RXAL): ORIGIN = CONFIG_ROM_ADDR, LENGTH = CONFIG_ROM_SIZE #endif mem_ram (RWAL): ORIGIN = CONFIG_RAM_ADDR, LENGTH = CONFIG_RAM_SIZE -//ajoute DG provisiore -//mwmr_ram (RWAL): ORIGIN = 0xA0200000, LENGTH = 0x00001000 -//mwmrd_ram (RWAL): ORIGIN = 0xB0200000, LENGTH = 0x00003000 -//19.05. une seule RAMLOCKS en cas de besoin (actually unused) +//DG 7.9. +#if defined(MWMR_RAM0_NAME) +mwmr_ram0 (RWAL): ORIGIN = 0xA0200000, LENGTH = 0x00001000 +#endif +#if defined(MWMR_RAM1_NAME) +mwmr_ram1 (RWAL): ORIGIN = 0xA1200000, LENGTH = 0x00001000 +#endif + vci_locks (RWAL): ORIGIN = 0xC0200000, LENGTH = 0x100 //ajout CD diff --git a/MPSoC/soclib/soclib/module/streaming_component/my_hwa0/caba/metadata/my_hwa0.sd b/MPSoC/soclib/soclib/module/streaming_component/my_hwa0/caba/metadata/my_hwa0.sd new file mode 100644 index 0000000000000000000000000000000000000000..dfcbdc2e048dad01e42f015fa79f863158fe305b --- /dev/null +++ b/MPSoC/soclib/soclib/module/streaming_component/my_hwa0/caba/metadata/my_hwa0.sd @@ -0,0 +1,25 @@ +Module('caba:MyHWA0', + classname = 'dsx::caba::MyHWA0', + header_files = [ + "my_hwa0.h", + + ], + interface_files = [ + ], + implementation_files = [ + "my_hwa0.cpp", + + ], + ports = [ + ], + uses = [ + Uses('caba:fifo_virtual_copro_wrapper'), + ], + instance_parameters = [ + ], + tmpl_parameters = [ + ], + extensions = [ + ], +) + diff --git a/MPSoC/soclib/soclib/module/streaming_component/my_hwa0/caba/source/include/my_hwa0.h b/MPSoC/soclib/soclib/module/streaming_component/my_hwa0/caba/source/include/my_hwa0.h new file mode 100644 index 0000000000000000000000000000000000000000..4e1d1a14edfe70bcf0d587f7fece6007271f23b0 --- /dev/null +++ b/MPSoC/soclib/soclib/module/streaming_component/my_hwa0/caba/source/include/my_hwa0.h @@ -0,0 +1,25 @@ +#ifndef _HWA0_H +#define _HWA0_H + +#include <systemc> + +#include "fifo_virtual_copro_wrapper.h" + +namespace dsx { namespace caba { + +class MyHWA0 + : public dsx::caba::FifoVirtualCoprocessorWrapper +{ + + public: + ~MyHWA0(); + MyHWA0(sc_core::sc_module_name insname); + + + private: + void * task_func(); // Task code + +}; + +}} +#endif diff --git a/MPSoC/soclib/soclib/module/streaming_component/my_hwa0/caba/source/src/anoc_copro_wrapper.cpp b/MPSoC/soclib/soclib/module/streaming_component/my_hwa0/caba/source/src/anoc_copro_wrapper.cpp new file mode 100644 index 0000000000000000000000000000000000000000..b4c4efdd6e200e1b778cf95e66b0dc903e1cc817 --- /dev/null +++ b/MPSoC/soclib/soclib/module/streaming_component/my_hwa0/caba/source/src/anoc_copro_wrapper.cpp @@ -0,0 +1,658 @@ +/* -*- c++ -*- + * + * SOCLIB_LGPL_HEADER_BEGIN + * + * This file is part of SoCLib, GNU LGPLv2.1. + * + * SoCLib is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published + * by the Free Software Foundation; version 2.1 of the License. + * + * SoCLib is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with SoCLib; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301 USA + * + * SOCLIB_LGPL_HEADER_END + * + * + * Copyright (c) CEA-LETI, MINATEC, 2008 + * + * Authors : + * + * History : + * + * Comment : + * + */ + +#include "anoc_copro_wrapper.h" +namespace soclib { namespace caba { +using soclib::common::alloc_elems; +using soclib::common::dealloc_elems; + +/*******************************************************************************/ +/*******************************************************************************/ +/// Constructor +anoc_copro_wrapper::anoc_copro_wrapper(sc_module_name module_name_, + t_uint16 nb_cores_, + t_uint16 nb_fifo_in_, + t_uint16 nb_fifo_out_, + t_uint16 n_config_, + t_uint16 n_status_, + t_uint32 clk_period_) : + sc_module(module_name_), + p_from_MWMR(alloc_elems<FifoInput<uint32_t> >("p_from_MWMR", nb_fifo_in_)), + p_to_MWMR(alloc_elems<FifoOutput<uint32_t> >("p_to_MWMR", nb_fifo_out_ )), + p_config(alloc_elems<sc_in<uint32_t> >("p_config", n_config_)), + p_status(alloc_elems<sc_out<uint32_t> >("p_status", n_status_)), + nb_cores(nb_cores_), + nb_fifo_in(nb_fifo_in_), + nb_fifo_out(nb_fifo_out_), + clk_period(clk_period_) +{ + core_fifo_in = new t_uint16[nb_fifo_in]; + for(int i=0; i<nb_fifo_in; i++) { + if(nb_cores>1) { +// core_fifo_in[i] = core_fifo_in_[i]; + } else { + core_fifo_in[i] = 0; // monocore, core_fifo_in_=NULL + } + } + core_fifo_out = new t_uint16[nb_fifo_out]; + for(int i=0; i<nb_fifo_out; i++) { + if(nb_cores>1) { +// core_fifo_out[i] = core_fifo_out_[i]; + } else { + core_fifo_out[i] = 0; // monocore, core_fifo_out_=NULL + } + } + + cfg_flag_core_finished = new bool [nb_cores]; + for(int i = 0; i < nb_cores; i++) { + cfg_flag_core_finished[i]=true; + } + + + // create ni => core ports +#ifdef TLM_TRANS_RECORD + char port_in[80]; + char port_out[80]; + char port_debug[80]; +#endif + char port_out_name[80]; + char port_in_name[80]; + +#ifdef TLM_TRANS_RECORD + sprintf(port_in,"%s_IN", basename()); + sprintf(port_out,"%s_OUT", basename()); + sprintf(port_debug,"%s_DEBUG", basename()); +#endif // TLM_TRANS_RECORD + + ni_exec_out = new ni_exec_out_port*[nb_cores]; + for(int i=0;i<nb_cores;i++) { + sprintf(port_out_name,"ni_exec_out_port_%i", i); + ni_exec_out[i] = new ni_exec_out_port((char *) port_out_name, "exec", "eoc"); + ni_exec_out[i]->put_if_bind(*this); // for the status target sub-port + } + + ni_cfg_dump_out = new ni_cfg_dump_out_port("ni_cfg_dump_out_port", "cfg_dump", "dump_data"); + ni_cfg_dump_out->put_if_bind(*this); // for the status target sub-port + + + t_uint16 fifo_id[nb_cores]; + for (int i=0; i<nb_cores; i++) { + fifo_id[i]=0; + } + ni_input_fifo_out = new ni_data_out_port*[nb_fifo_in]; + for(int i=0;i<nb_fifo_in;i++) { + sprintf(port_out_name,"ni_input_fifo_out_port_%i", i); +#ifdef TLM_TRANS_RECORD + sprintf(port_out,"%s_input_fifo_out_%i", basename(), i); + ni_input_fifo_out[i] = new ni_data_out_port((char *) port_out_name, (char *)port_out, fifo_id[core_fifo_in[i]]); +#else + ni_input_fifo_out[i] = new ni_data_out_port((char *) port_out_name, fifo_id[core_fifo_in[i]]); +#endif // TLM_TRANS_RECORD + fifo_id[core_fifo_in[i]]++; + ni_input_fifo_out[i]->put_if_bind(*this); // for the status target sub-port + } + + // create core => ni ports + for (int i=0; i<nb_cores; i++) { + fifo_id[i]=0; + } + ni_output_fifo_in = new ni_data_in_port*[nb_fifo_out]; + for(int i=0;i<nb_fifo_out;i++) { + sprintf(port_in_name,"ni_output_fifo_in_port_%i", i); +#ifdef TLM_TRANS_RECORD + sprintf(port_in,"%s_output_fifo_in_%i", basename(), i); + ni_output_fifo_in[i] = new ni_data_in_port((char *) port_in_name, (char *)port_in, fifo_id[core_fifo_out[i]]); +#else + ni_output_fifo_in[i] = new ni_data_in_port((char *) port_in_name, fifo_id[core_fifo_out[i]]); +#endif // TLM_TRANS_RECORD + fifo_id[core_fifo_out[i]]++; + ni_output_fifo_in[i]->put_if_bind(*this); // for the status target sub-port + } + + ni_released_in = new ni_released_in_port*[nb_fifo_in]; + for(int i=0;i<nb_fifo_in;i++) { + sprintf(port_in_name,"ni_released_in_port_%i", i); +#ifdef TLM_TRANS_RECORD + sprintf(port_in,"%s_released_in_%i", basename(), i); + ni_released_in[i] = new ni_released_in_port((char *) port_in_name, (char *)port_in); +#else + ni_released_in[i] = new ni_released_in_port((char *) port_in_name); +#endif // TLM_TRANS_RECORD + ni_released_in[i]->put_if_bind(*this); // for the status target sub-port + } + + ni_available_in = new ni_available_in_port*[nb_fifo_out]; + for(int i=0;i<nb_fifo_out;i++) { + sprintf(port_in_name,"ni_available_in_port_%i", i); +#ifdef TLM_TRANS_RECORD + sprintf(port_in,"%s_available_in_%i", basename(), i); + ni_available_in[i] = new ni_available_in_port((char *) port_in_name, (char *)port_in); +#else + ni_available_in[i] = new ni_available_in_port((char *) port_in_name); +#endif // TLM_TRANS_RECORD + ni_available_in[i]->put_if_bind(*this); // for the status target sub-port + } + + ni_status_in = new ni_status_in_port*[nb_cores]; + for(int i=0;i<nb_cores;i++) { + sprintf(port_in_name,"ni_status_in_port_%i", i); +#ifdef TLM_TRANS_RECORD + sprintf(port_in,"%s_status_in_%i", basename(), i); + ni_status_in[i] = new ni_status_in_port((char *) port_in_name, (char *)port_in); +#else + ni_status_in[i] = new ni_status_in_port((char *) port_in_name); +#endif // TLM_TRANS_RECORD + ni_status_in[i]->put_if_bind(*this); // for the status target sub-port + } + + + /***********************************************/ + // internal programmation + + /***********************************************/ + // internal state variables + + last_status = new t_uint32[nb_cores]; + for(int i=0; i<nb_cores; i++) { + last_status[i] = 0; + } + + tab_out_data_fifo_out = new t_uint32[nb_fifo_out]; + flag_tab_out_data_fifo_out = new bool[nb_fifo_out]; + tab_available_data_fifo_out = new t_uint32[nb_fifo_out]; + for (int i = 0; i < nb_fifo_out; i++) { + tab_out_data_fifo_out[i] = 0; + flag_tab_out_data_fifo_out[i] = false; + tab_available_data_fifo_out[i]=0; + } + tab_fifo_in_accept = new bool[nb_fifo_in]; + for (int i = 0; i < nb_fifo_in; i++) { + // fifo accept is initialised to true: ready to accept a new value + tab_fifo_in_accept[i] = true; + } + + + /***********************************************/ + // threads & methods + SC_METHOD(rtl_to_tlm); + sensitive << rtl_to_tlm_event; + dont_initialize(); + + SC_METHOD(tlm_to_rtl); + sensitive << p_clk.neg(); + dont_initialize(); + + EXPRINT(ni, 2,"anoc_copro_wrapper CREATED"); +} + +/*******************************************************************************/ +/*******************************************************************************/ +/// Destructor +anoc_copro_wrapper::~anoc_copro_wrapper() { + + cout << "-------------- DELETE " << name() << " -------------- " << endl; + + + + delete core_fifo_in; + delete core_fifo_out; + for(int i=0;i<nb_cores;i++) { + delete ni_exec_out[i]; + } + delete ni_exec_out; + delete ni_cfg_dump_out; + for(int i=0;i<nb_fifo_in;i++) { + delete ni_input_fifo_out[i]; + } + delete ni_input_fifo_out; + for(int i=0;i<nb_fifo_out;i++) { + delete ni_output_fifo_in[i]; + } + delete ni_output_fifo_in; + for(int i=0;i<nb_fifo_in;i++) { + delete ni_released_in[i]; + } + delete ni_released_in; + for(int i=0;i<nb_fifo_out;i++) { + delete ni_available_in[i]; + } + delete ni_available_in; + for(int i=0;i<nb_cores;i++) { + delete ni_status_in[i]; + } + delete ni_status_in; + +} + + +/*******************************************************************************/ +/*******************************************************************************/ +/// Receive DUMP DATA transaction (remote call) +void anoc_copro_wrapper::put(const ni_dump_data_transaction &transaction) { + //Not yet implemented +#ifdef _ANOC_COPRO_DEBUG + printf("DUMP DATA transaction\n"); +#endif +} + + +/*******************************************************************************/ +/*******************************************************************************/ +/// Receive RELEASED transaction (remote call) +void anoc_copro_wrapper::put(const ni_released_transaction &transaction) { +#ifdef _ANOC_COPRO_DEBUG + printf("RELEASED transaction\n"); +#endif + t_uint16 fifo_id = 0; + t_uint16 source_id; + t_uint16 core_id; + t_uint32 size_released; + bool fifo_ok = false; + + source_id = transaction.get_source_id(); + core_id = transaction.get_core_id(); + size_released = transaction.get_data(); + + int j=0; + for(int i=0; i<nb_fifo_in; i++) { + if(core_fifo_in[i]==core_id) { + if(j==source_id) { + fifo_id = i; + fifo_ok=true; + } + j++; + } + } + + if(fifo_ok) { + EXPRINT(ni, 1,"Receive released ("<< size_released <<") from fifo: " << fifo_id); +// tab_available_size_fifo_in[fifo_id]+=size_released; + } else { + EXPRINT(ni, 0,"ERROR : invalid source id " << source_id << " for released from CORE " << core_id); + exit(0); + } +} + +/*******************************************************************************/ +/*******************************************************************************/ +/// Receive AVAILABLE transaction (remote call) +void anoc_copro_wrapper::put(const ni_available_transaction &transaction) { +#ifdef _ANOC_COPRO_DEBUG + printf("AVAILABLE transaction\n"); +#endif + t_uint16 fifo_id = 0; + t_uint16 source_id; + t_uint16 core_id; + t_uint32 available_data; + bool fifo_ok = false; + + source_id = transaction.get_source_id(); + core_id = transaction.get_core_id(); + available_data = transaction.get_data(); + + int j=0; + for(int i=0; i<nb_fifo_out; i++) { + if(core_fifo_out[i]==core_id) { + if(j==source_id) { + fifo_id = i; + fifo_ok=true; + } + j++; + } + } + if(fifo_ok) { + EXPRINT(ni, 1,"Receive available (" << available_data << ") from fifo: " << fifo_id); + tab_available_data_fifo_out[fifo_id] = available_data; + } else { + EXPRINT(ni, 0,"ERROR : invalid source id " << source_id << " for avaivable from CORE " << core_id); + exit(0); + } +} + +/*******************************************************************************/ +/*******************************************************************************/ +/// Receive WRITE DATA transaction (remote call) +void anoc_copro_wrapper::put(const ni_write_data_transaction &transaction) { +#ifdef _ANOC_COPRO_DEBUG + printf("Received DATA transaction\n"); +#endif + + t_uint16 fifo_id = 0; + t_uint16 source_id; + t_uint16 core_id; + t_uint32 data; + bool fifo_ok = false; + + source_id = transaction.get_source_id(); + core_id = transaction.get_core_id(); + data = transaction.get_data(); + + int j=0; + for(int i=0; i<nb_fifo_out; i++) { + if(core_fifo_out[i]==core_id) { + if(j==source_id) { + fifo_id = i; + fifo_ok=true; + } + j++; + } + } + + if(fifo_ok) { + EXPRINT(ni, 1,"Receive write data: " << data << " from fifo: " << fifo_id); + tab_out_data_fifo_out[fifo_id] = data; + flag_tab_out_data_fifo_out[fifo_id] = true; + //Requires a data update on the RTL ports + write_data_update = true; + } else { + EXPRINT(ni, 0,"ERROR : invalid source id " << source_id << " for write data from CORE " << core_id); + exit(0); + } + +} + +/*******************************************************************************/ +/*******************************************************************************/ +/// Write DATA ACCEPT transaction for fifo out +void anoc_copro_wrapper::write_data_accept_fifo_out(int num_fifo) { +#ifdef _ANOC_COPRO_DEBUG + printf("DATA ACCEPT transaction\n"); +#endif + ni_accept_data_transaction accept_trans; + ni_output_fifo_in[num_fifo]->put(&accept_trans); +} + + +/*******************************************************************************/ +/*******************************************************************************/ +/// Receive ACCEPT DATA transaction (remote call) +void anoc_copro_wrapper::put(const ni_accept_data_transaction &transaction) { +#ifdef _ANOC_COPRO_DEBUG + printf("ACCEPT DATA transaction\n"); +#endif + t_uint16 source_id; + t_uint16 fifo_id = 0; + t_uint16 core_id; + bool fifo_ok=false; + + source_id = transaction.get_source_id(); + core_id = transaction.get_core_id(); + + int j=0; + for(int i=0; i<nb_fifo_in; i++) { + if(core_fifo_in[i]==core_id) { + if(j==source_id) { + fifo_id = i; + fifo_ok=true; + } + j++; + } + } + + if(fifo_ok) { + EXPRINT(ni, 1,"Receive accept data from fifo: " << fifo_id); //FIXPRINT + tab_fifo_in_accept[fifo_id] = true; + //Requires to update the accept_data (Ivan) + accept_data_update = true; + } else { + EXPRINT(ni, 0,"ERROR : invalid source id " << source_id << " for accept data from CORE " << core_id ); + exit(0); + } + +} + +/*******************************************************************************/ +/*******************************************************************************/ +/// Write WRITE DATA transaction for fifo in +void anoc_copro_wrapper::write_data_fifo_in(int num_fifo, t_uint32 data) { +#ifdef _ANOC_COPRO_DEBUG + printf("WRITE DATA transaction\n"); +#endif + + ni_write_data_transaction data_trans; + data_trans.set_data(data); + EXPRINT(ni, 1,"Write data " << data << " in fifo_in[" << num_fifo << "]"); //FIXPRINT + ni_input_fifo_out[num_fifo]->put(&data_trans); + +} + +/*******************************************************************************/ +/*******************************************************************************/ +/// Receive STATUS transaction (remote call) +void anoc_copro_wrapper::put(const ni_status_transaction &transaction) { +#ifdef _ANOC_COPRO_DEBUG + printf("STATUS transaction\n"); +#endif + + t_uint16 core_id; + core_id = transaction.get_core_id(); + if(core_id>=nb_cores) { + EXPRINT(ni, 0,"ERROR : Invalid core id for status"); + exit(0); + } + + last_status[core_id] = transaction.get_status(); + //Requires to update the status port + status_update = true; + + EXPRINT(ni, 0,"New status from CORE " << core_id <<" : " << last_status[core_id]); //FIXPRINT + +} + +/*******************************************************************************/ +/*******************************************************************************/ +/// Receive EOC transaction (remote call) +void anoc_copro_wrapper::put(const ni_eoc_transaction &transaction) { +#ifdef _ANOC_COPRO_DEBUG + printf("EOC transaction\n"); +#endif + + t_uint16 core_id; + core_id = transaction.get_core_id(); + if(core_id>=nb_cores) { + EXPRINT(ni, 0,"ERROR : Invalid core_id for eoc"); + exit(0); + } + + EXPRINT(ni, 0,"CORE " << core_id << " has finished"); //FIXPRINT + cfg_flag_core_finished[core_id] = true; + //Requires to update the eoc + eoc_update = true; + +} + +/*******************************************************************************/ +/*******************************************************************************/ +// Update the RTL signals when a TLM transcation arrive +/// Sensitive_neg << p_clk +void anoc_copro_wrapper::tlm_to_rtl() { + //Output FIFOs + ////////////// + // The Data port need to be updated ? +// if (write_data_update == true) { +// printf("write_data_update, %i\n",(int)flag_tab_out_data_fifo_out[0]); +// for(int i=0; i<nb_fifo_out; i++) { +// p_to_MWMR[i].w = flag_tab_out_data_fifo_out[i]; +// p_to_MWMR[i].data = tab_out_data_fifo_out[i]; +// } +// //the Data is correctly updated +// write_data_update = false; +// } + //Input FIFOs + ///////////// + // The Accept port need to be updated ? +// if (accept_data_update == true) { +// for(int i=0; i<nb_fifo_in; i++) { +// p_from_MWMR[i].r = tab_fifo_in_accept[i]; +// } +// //the Data is correctly updated +// accept_data_update = false; +// } + //Status port + ///////////// + // The Accept port need to be updated ? + if (status_update == true) { + for (int i=0; i<nb_cores; i++) { + p_status[i+1] = last_status[i]; + } + status_update = false; + } + //EOC port + ///////////// + if (eoc_update == true) { + uint32_t value = 0; + for (int i=0; i<nb_cores; i++) { + if (cfg_flag_core_finished[i] == true) { + value += 1 << i; + } + } + p_status[0] = value; + eoc_update = false; + } + + //Core configuration + //////////////////// + p_core_config.r = true; + + //Start the rtl_to_tlm process + rtl_to_tlm_event.notify(clk_period/4,SC_PS); +} + + +/*******************************************************************************/ +/*******************************************************************************/ +// Generate a TLM transaction when the RTL signals change +/// Sensitive_pos << 3/4*p_clk +void anoc_copro_wrapper::rtl_to_tlm() { + + //Output FIFOs + ////////////// + //Test if a Send signal is active + for(int i=0; i<nb_fifo_out; i++) { + //A FIFO was ready to send data ? + p_to_MWMR[i].w = false; + if (flag_tab_out_data_fifo_out[i]) { + //Chech if the accept signal is High + if (p_to_MWMR[i].wok.read() == true) { + //The FIFO data is correcly transfered + p_to_MWMR[i].w = true; + p_to_MWMR[i].data = tab_out_data_fifo_out[i]; + + //Invalidate the send signal + flag_tab_out_data_fifo_out[i] = false; + //Requires to update the Data port + write_data_update = true; + //Send the TLM Accept transaction to the Core + if (tab_available_data_fifo_out[i] > 1 ) + write_data_accept_fifo_out(i); + } + } else if (tab_available_data_fifo_out[i] > 0 ) { + //New data can be read? + //Send the TLM Accept transaction to the Core + write_data_accept_fifo_out(i); + } + } + + //Input FIFOs + ///////////// + //Test if a new Data is present on the Input FIFOs + for(int i=0; i<nb_fifo_in; i++) { + p_from_MWMR[i].r = tab_fifo_in_accept[i]; + if (p_from_MWMR[i].rok.read() == true) { + //I am ready to accept this new data? + if (tab_fifo_in_accept[i] == true) { + //Read the data and send a TLM transcation + p_from_MWMR[i].r = true; + t_uint32 data = (t_uint32)p_from_MWMR[i].data.read(); + write_data_fifo_in(i, data); + //Lower the ROK signal + tab_fifo_in_accept[i] = false; + //Requires a Accept RTL port update + accept_data_update = true; + } + } + } + + //Exec port + /////////////// + //RTL signals changed? + if (exec_last != p_config[0].read()) { + ni_exec_transaction exec_trans; + //Test bit by bit to identify the source + for(int i=0; i<nb_cores; i++) { + if (((exec_last & (1<<i)) == 0) && ((p_config[0].read() & (1<<i)) == 1)) { + //A new lot_id is ready to be executed on core 'i' + EXPRINT(ni, 1,"CORE configuration event"); + //Get the slot_id + t_uint16 slot_id = (t_uint16)p_config[i+1].read(); + EXPRINT(ni, 0,"CORE " << i << " execute configuration on slot id " << slot_id); + // write exec config + exec_trans.set_slot_id(slot_id); + ni_exec_out[i]->put(&exec_trans); + //The CORE is nolonger finished + cfg_flag_core_finished[i] = false; + //Requires a RTL signal update + eoc_update = true; + } + } + exec_last = p_config[0].read(); + } + + //Core config address + ///////////////////// + if (last_address != p_config[5].read()) { + //The address have been changed + current_address = p_config[5].read(); + last_address = p_config[5].read(); + } + + + //Core configuration + //////////////////// + if (p_core_config.rok.read() == true) { + //A new configuration data is ready + ni_cfg_transaction cfg_trans; + t_uint32 data = p_core_config.data.read(); + cfg_trans.set_data(data); + cfg_trans.set_address(current_address); +#ifdef _ANOC_COPRO_DEBUG + printf("Ivan: Config data: %.8x on address %.8x\n", data, current_address); +#endif + ni_cfg_dump_out->put(&cfg_trans); + current_address++; + } + +} +}} + + diff --git a/MPSoC/soclib/soclib/module/streaming_component/my_hwa0/caba/source/src/my_hwa0.cpp b/MPSoC/soclib/soclib/module/streaming_component/my_hwa0/caba/source/src/my_hwa0.cpp new file mode 100644 index 0000000000000000000000000000000000000000..20c731c9d5a4204e2ff491696edde752f4e5637b --- /dev/null +++ b/MPSoC/soclib/soclib/module/streaming_component/my_hwa0/caba/source/src/my_hwa0.cpp @@ -0,0 +1,32 @@ + +namespace dsx { namespace caba { + + +#define tmpl(...) __VA_ARGS__ MyHWA0 + +tmpl(/**/)::~MyHWA0() +{ +} + + //intArray(1,1) there is one element (here an integer) of size 4 OCTETs/Quentin: attention cela a change c'est un MOT dans la version VM +tmpl(/**/)::MyHWA0(sc_core::sc_module_name insname) + :dsx::caba::FifoVirtualCoprocessorWrapper(insname, stringArray("output", NULL), intArray(1,4), stringArray(NULL), NULL) +{ +} + +tmpl(void *)::task_func() { + struct mwmr_s *output; +// mwmr_t output = SRL_GET_MWMR(output); + uint32_t data; + + while (true) { + for (int32_t i = 0; i < 8; i++) { + out=i; + mwmr_write(output, &data, 4; // Write integers 0 to 7 to output + } + + } +} + +}} + diff --git a/MPSoC/soclib/soclib/module/streaming_component/my_hwa1/caba/metadata/my_hwa0.sd b/MPSoC/soclib/soclib/module/streaming_component/my_hwa1/caba/metadata/my_hwa0.sd new file mode 100644 index 0000000000000000000000000000000000000000..dfcbdc2e048dad01e42f015fa79f863158fe305b --- /dev/null +++ b/MPSoC/soclib/soclib/module/streaming_component/my_hwa1/caba/metadata/my_hwa0.sd @@ -0,0 +1,25 @@ +Module('caba:MyHWA0', + classname = 'dsx::caba::MyHWA0', + header_files = [ + "my_hwa0.h", + + ], + interface_files = [ + ], + implementation_files = [ + "my_hwa0.cpp", + + ], + ports = [ + ], + uses = [ + Uses('caba:fifo_virtual_copro_wrapper'), + ], + instance_parameters = [ + ], + tmpl_parameters = [ + ], + extensions = [ + ], +) + diff --git a/MPSoC/soclib/soclib/module/streaming_component/my_hwa1/caba/metadata/my_hwa1.sd b/MPSoC/soclib/soclib/module/streaming_component/my_hwa1/caba/metadata/my_hwa1.sd new file mode 100644 index 0000000000000000000000000000000000000000..b0b32c5d02b89461309026540679146eb791a8d9 --- /dev/null +++ b/MPSoC/soclib/soclib/module/streaming_component/my_hwa1/caba/metadata/my_hwa1.sd @@ -0,0 +1,25 @@ +Module('caba:MyHWA1', + classname = 'dsx::caba::MyHWA1', + header_files = [ + "my_hwa1.h", + + ], + interface_files = [ + ], + implementation_files = [ + "my_hwa1.cpp", + + ], + ports = [ + ], + uses = [ + Uses('caba:fifo_virtual_copro_wrapper'), + ], + instance_parameters = [ + ], + tmpl_parameters = [ + ], + extensions = [ + ], +) + diff --git a/MPSoC/soclib/soclib/module/streaming_component/my_hwa1/caba/source/include/my_hwa0.h b/MPSoC/soclib/soclib/module/streaming_component/my_hwa1/caba/source/include/my_hwa0.h new file mode 100644 index 0000000000000000000000000000000000000000..4e1d1a14edfe70bcf0d587f7fece6007271f23b0 --- /dev/null +++ b/MPSoC/soclib/soclib/module/streaming_component/my_hwa1/caba/source/include/my_hwa0.h @@ -0,0 +1,25 @@ +#ifndef _HWA0_H +#define _HWA0_H + +#include <systemc> + +#include "fifo_virtual_copro_wrapper.h" + +namespace dsx { namespace caba { + +class MyHWA0 + : public dsx::caba::FifoVirtualCoprocessorWrapper +{ + + public: + ~MyHWA0(); + MyHWA0(sc_core::sc_module_name insname); + + + private: + void * task_func(); // Task code + +}; + +}} +#endif diff --git a/MPSoC/soclib/soclib/module/streaming_component/my_hwa1/caba/source/include/my_hwa1.h b/MPSoC/soclib/soclib/module/streaming_component/my_hwa1/caba/source/include/my_hwa1.h new file mode 100644 index 0000000000000000000000000000000000000000..785ede2fc51a0a70da87f81a178122b7dd8f50f4 --- /dev/null +++ b/MPSoC/soclib/soclib/module/streaming_component/my_hwa1/caba/source/include/my_hwa1.h @@ -0,0 +1,26 @@ +#ifndef _HWA1_H +#define _HWA1_H + +#include <systemc> + +#include "fifo_virtual_copro_wrapper.h" + +namespace dsx { namespace caba { + +class MyHWA1 + : public dsx::caba::FifoVirtualCoprocessorWrapper +{ + + public: + ~MyHWA1(); + MyHWA1(sc_core::sc_module_name insname); + + + private: + void * task_func(); // Task code + +}; + +}} +#endif + diff --git a/MPSoC/soclib/soclib/module/streaming_component/my_hwa1/caba/source/src/anoc_copro_wrapper.cpp b/MPSoC/soclib/soclib/module/streaming_component/my_hwa1/caba/source/src/anoc_copro_wrapper.cpp new file mode 100644 index 0000000000000000000000000000000000000000..b4c4efdd6e200e1b778cf95e66b0dc903e1cc817 --- /dev/null +++ b/MPSoC/soclib/soclib/module/streaming_component/my_hwa1/caba/source/src/anoc_copro_wrapper.cpp @@ -0,0 +1,658 @@ +/* -*- c++ -*- + * + * SOCLIB_LGPL_HEADER_BEGIN + * + * This file is part of SoCLib, GNU LGPLv2.1. + * + * SoCLib is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published + * by the Free Software Foundation; version 2.1 of the License. + * + * SoCLib is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with SoCLib; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301 USA + * + * SOCLIB_LGPL_HEADER_END + * + * + * Copyright (c) CEA-LETI, MINATEC, 2008 + * + * Authors : + * + * History : + * + * Comment : + * + */ + +#include "anoc_copro_wrapper.h" +namespace soclib { namespace caba { +using soclib::common::alloc_elems; +using soclib::common::dealloc_elems; + +/*******************************************************************************/ +/*******************************************************************************/ +/// Constructor +anoc_copro_wrapper::anoc_copro_wrapper(sc_module_name module_name_, + t_uint16 nb_cores_, + t_uint16 nb_fifo_in_, + t_uint16 nb_fifo_out_, + t_uint16 n_config_, + t_uint16 n_status_, + t_uint32 clk_period_) : + sc_module(module_name_), + p_from_MWMR(alloc_elems<FifoInput<uint32_t> >("p_from_MWMR", nb_fifo_in_)), + p_to_MWMR(alloc_elems<FifoOutput<uint32_t> >("p_to_MWMR", nb_fifo_out_ )), + p_config(alloc_elems<sc_in<uint32_t> >("p_config", n_config_)), + p_status(alloc_elems<sc_out<uint32_t> >("p_status", n_status_)), + nb_cores(nb_cores_), + nb_fifo_in(nb_fifo_in_), + nb_fifo_out(nb_fifo_out_), + clk_period(clk_period_) +{ + core_fifo_in = new t_uint16[nb_fifo_in]; + for(int i=0; i<nb_fifo_in; i++) { + if(nb_cores>1) { +// core_fifo_in[i] = core_fifo_in_[i]; + } else { + core_fifo_in[i] = 0; // monocore, core_fifo_in_=NULL + } + } + core_fifo_out = new t_uint16[nb_fifo_out]; + for(int i=0; i<nb_fifo_out; i++) { + if(nb_cores>1) { +// core_fifo_out[i] = core_fifo_out_[i]; + } else { + core_fifo_out[i] = 0; // monocore, core_fifo_out_=NULL + } + } + + cfg_flag_core_finished = new bool [nb_cores]; + for(int i = 0; i < nb_cores; i++) { + cfg_flag_core_finished[i]=true; + } + + + // create ni => core ports +#ifdef TLM_TRANS_RECORD + char port_in[80]; + char port_out[80]; + char port_debug[80]; +#endif + char port_out_name[80]; + char port_in_name[80]; + +#ifdef TLM_TRANS_RECORD + sprintf(port_in,"%s_IN", basename()); + sprintf(port_out,"%s_OUT", basename()); + sprintf(port_debug,"%s_DEBUG", basename()); +#endif // TLM_TRANS_RECORD + + ni_exec_out = new ni_exec_out_port*[nb_cores]; + for(int i=0;i<nb_cores;i++) { + sprintf(port_out_name,"ni_exec_out_port_%i", i); + ni_exec_out[i] = new ni_exec_out_port((char *) port_out_name, "exec", "eoc"); + ni_exec_out[i]->put_if_bind(*this); // for the status target sub-port + } + + ni_cfg_dump_out = new ni_cfg_dump_out_port("ni_cfg_dump_out_port", "cfg_dump", "dump_data"); + ni_cfg_dump_out->put_if_bind(*this); // for the status target sub-port + + + t_uint16 fifo_id[nb_cores]; + for (int i=0; i<nb_cores; i++) { + fifo_id[i]=0; + } + ni_input_fifo_out = new ni_data_out_port*[nb_fifo_in]; + for(int i=0;i<nb_fifo_in;i++) { + sprintf(port_out_name,"ni_input_fifo_out_port_%i", i); +#ifdef TLM_TRANS_RECORD + sprintf(port_out,"%s_input_fifo_out_%i", basename(), i); + ni_input_fifo_out[i] = new ni_data_out_port((char *) port_out_name, (char *)port_out, fifo_id[core_fifo_in[i]]); +#else + ni_input_fifo_out[i] = new ni_data_out_port((char *) port_out_name, fifo_id[core_fifo_in[i]]); +#endif // TLM_TRANS_RECORD + fifo_id[core_fifo_in[i]]++; + ni_input_fifo_out[i]->put_if_bind(*this); // for the status target sub-port + } + + // create core => ni ports + for (int i=0; i<nb_cores; i++) { + fifo_id[i]=0; + } + ni_output_fifo_in = new ni_data_in_port*[nb_fifo_out]; + for(int i=0;i<nb_fifo_out;i++) { + sprintf(port_in_name,"ni_output_fifo_in_port_%i", i); +#ifdef TLM_TRANS_RECORD + sprintf(port_in,"%s_output_fifo_in_%i", basename(), i); + ni_output_fifo_in[i] = new ni_data_in_port((char *) port_in_name, (char *)port_in, fifo_id[core_fifo_out[i]]); +#else + ni_output_fifo_in[i] = new ni_data_in_port((char *) port_in_name, fifo_id[core_fifo_out[i]]); +#endif // TLM_TRANS_RECORD + fifo_id[core_fifo_out[i]]++; + ni_output_fifo_in[i]->put_if_bind(*this); // for the status target sub-port + } + + ni_released_in = new ni_released_in_port*[nb_fifo_in]; + for(int i=0;i<nb_fifo_in;i++) { + sprintf(port_in_name,"ni_released_in_port_%i", i); +#ifdef TLM_TRANS_RECORD + sprintf(port_in,"%s_released_in_%i", basename(), i); + ni_released_in[i] = new ni_released_in_port((char *) port_in_name, (char *)port_in); +#else + ni_released_in[i] = new ni_released_in_port((char *) port_in_name); +#endif // TLM_TRANS_RECORD + ni_released_in[i]->put_if_bind(*this); // for the status target sub-port + } + + ni_available_in = new ni_available_in_port*[nb_fifo_out]; + for(int i=0;i<nb_fifo_out;i++) { + sprintf(port_in_name,"ni_available_in_port_%i", i); +#ifdef TLM_TRANS_RECORD + sprintf(port_in,"%s_available_in_%i", basename(), i); + ni_available_in[i] = new ni_available_in_port((char *) port_in_name, (char *)port_in); +#else + ni_available_in[i] = new ni_available_in_port((char *) port_in_name); +#endif // TLM_TRANS_RECORD + ni_available_in[i]->put_if_bind(*this); // for the status target sub-port + } + + ni_status_in = new ni_status_in_port*[nb_cores]; + for(int i=0;i<nb_cores;i++) { + sprintf(port_in_name,"ni_status_in_port_%i", i); +#ifdef TLM_TRANS_RECORD + sprintf(port_in,"%s_status_in_%i", basename(), i); + ni_status_in[i] = new ni_status_in_port((char *) port_in_name, (char *)port_in); +#else + ni_status_in[i] = new ni_status_in_port((char *) port_in_name); +#endif // TLM_TRANS_RECORD + ni_status_in[i]->put_if_bind(*this); // for the status target sub-port + } + + + /***********************************************/ + // internal programmation + + /***********************************************/ + // internal state variables + + last_status = new t_uint32[nb_cores]; + for(int i=0; i<nb_cores; i++) { + last_status[i] = 0; + } + + tab_out_data_fifo_out = new t_uint32[nb_fifo_out]; + flag_tab_out_data_fifo_out = new bool[nb_fifo_out]; + tab_available_data_fifo_out = new t_uint32[nb_fifo_out]; + for (int i = 0; i < nb_fifo_out; i++) { + tab_out_data_fifo_out[i] = 0; + flag_tab_out_data_fifo_out[i] = false; + tab_available_data_fifo_out[i]=0; + } + tab_fifo_in_accept = new bool[nb_fifo_in]; + for (int i = 0; i < nb_fifo_in; i++) { + // fifo accept is initialised to true: ready to accept a new value + tab_fifo_in_accept[i] = true; + } + + + /***********************************************/ + // threads & methods + SC_METHOD(rtl_to_tlm); + sensitive << rtl_to_tlm_event; + dont_initialize(); + + SC_METHOD(tlm_to_rtl); + sensitive << p_clk.neg(); + dont_initialize(); + + EXPRINT(ni, 2,"anoc_copro_wrapper CREATED"); +} + +/*******************************************************************************/ +/*******************************************************************************/ +/// Destructor +anoc_copro_wrapper::~anoc_copro_wrapper() { + + cout << "-------------- DELETE " << name() << " -------------- " << endl; + + + + delete core_fifo_in; + delete core_fifo_out; + for(int i=0;i<nb_cores;i++) { + delete ni_exec_out[i]; + } + delete ni_exec_out; + delete ni_cfg_dump_out; + for(int i=0;i<nb_fifo_in;i++) { + delete ni_input_fifo_out[i]; + } + delete ni_input_fifo_out; + for(int i=0;i<nb_fifo_out;i++) { + delete ni_output_fifo_in[i]; + } + delete ni_output_fifo_in; + for(int i=0;i<nb_fifo_in;i++) { + delete ni_released_in[i]; + } + delete ni_released_in; + for(int i=0;i<nb_fifo_out;i++) { + delete ni_available_in[i]; + } + delete ni_available_in; + for(int i=0;i<nb_cores;i++) { + delete ni_status_in[i]; + } + delete ni_status_in; + +} + + +/*******************************************************************************/ +/*******************************************************************************/ +/// Receive DUMP DATA transaction (remote call) +void anoc_copro_wrapper::put(const ni_dump_data_transaction &transaction) { + //Not yet implemented +#ifdef _ANOC_COPRO_DEBUG + printf("DUMP DATA transaction\n"); +#endif +} + + +/*******************************************************************************/ +/*******************************************************************************/ +/// Receive RELEASED transaction (remote call) +void anoc_copro_wrapper::put(const ni_released_transaction &transaction) { +#ifdef _ANOC_COPRO_DEBUG + printf("RELEASED transaction\n"); +#endif + t_uint16 fifo_id = 0; + t_uint16 source_id; + t_uint16 core_id; + t_uint32 size_released; + bool fifo_ok = false; + + source_id = transaction.get_source_id(); + core_id = transaction.get_core_id(); + size_released = transaction.get_data(); + + int j=0; + for(int i=0; i<nb_fifo_in; i++) { + if(core_fifo_in[i]==core_id) { + if(j==source_id) { + fifo_id = i; + fifo_ok=true; + } + j++; + } + } + + if(fifo_ok) { + EXPRINT(ni, 1,"Receive released ("<< size_released <<") from fifo: " << fifo_id); +// tab_available_size_fifo_in[fifo_id]+=size_released; + } else { + EXPRINT(ni, 0,"ERROR : invalid source id " << source_id << " for released from CORE " << core_id); + exit(0); + } +} + +/*******************************************************************************/ +/*******************************************************************************/ +/// Receive AVAILABLE transaction (remote call) +void anoc_copro_wrapper::put(const ni_available_transaction &transaction) { +#ifdef _ANOC_COPRO_DEBUG + printf("AVAILABLE transaction\n"); +#endif + t_uint16 fifo_id = 0; + t_uint16 source_id; + t_uint16 core_id; + t_uint32 available_data; + bool fifo_ok = false; + + source_id = transaction.get_source_id(); + core_id = transaction.get_core_id(); + available_data = transaction.get_data(); + + int j=0; + for(int i=0; i<nb_fifo_out; i++) { + if(core_fifo_out[i]==core_id) { + if(j==source_id) { + fifo_id = i; + fifo_ok=true; + } + j++; + } + } + if(fifo_ok) { + EXPRINT(ni, 1,"Receive available (" << available_data << ") from fifo: " << fifo_id); + tab_available_data_fifo_out[fifo_id] = available_data; + } else { + EXPRINT(ni, 0,"ERROR : invalid source id " << source_id << " for avaivable from CORE " << core_id); + exit(0); + } +} + +/*******************************************************************************/ +/*******************************************************************************/ +/// Receive WRITE DATA transaction (remote call) +void anoc_copro_wrapper::put(const ni_write_data_transaction &transaction) { +#ifdef _ANOC_COPRO_DEBUG + printf("Received DATA transaction\n"); +#endif + + t_uint16 fifo_id = 0; + t_uint16 source_id; + t_uint16 core_id; + t_uint32 data; + bool fifo_ok = false; + + source_id = transaction.get_source_id(); + core_id = transaction.get_core_id(); + data = transaction.get_data(); + + int j=0; + for(int i=0; i<nb_fifo_out; i++) { + if(core_fifo_out[i]==core_id) { + if(j==source_id) { + fifo_id = i; + fifo_ok=true; + } + j++; + } + } + + if(fifo_ok) { + EXPRINT(ni, 1,"Receive write data: " << data << " from fifo: " << fifo_id); + tab_out_data_fifo_out[fifo_id] = data; + flag_tab_out_data_fifo_out[fifo_id] = true; + //Requires a data update on the RTL ports + write_data_update = true; + } else { + EXPRINT(ni, 0,"ERROR : invalid source id " << source_id << " for write data from CORE " << core_id); + exit(0); + } + +} + +/*******************************************************************************/ +/*******************************************************************************/ +/// Write DATA ACCEPT transaction for fifo out +void anoc_copro_wrapper::write_data_accept_fifo_out(int num_fifo) { +#ifdef _ANOC_COPRO_DEBUG + printf("DATA ACCEPT transaction\n"); +#endif + ni_accept_data_transaction accept_trans; + ni_output_fifo_in[num_fifo]->put(&accept_trans); +} + + +/*******************************************************************************/ +/*******************************************************************************/ +/// Receive ACCEPT DATA transaction (remote call) +void anoc_copro_wrapper::put(const ni_accept_data_transaction &transaction) { +#ifdef _ANOC_COPRO_DEBUG + printf("ACCEPT DATA transaction\n"); +#endif + t_uint16 source_id; + t_uint16 fifo_id = 0; + t_uint16 core_id; + bool fifo_ok=false; + + source_id = transaction.get_source_id(); + core_id = transaction.get_core_id(); + + int j=0; + for(int i=0; i<nb_fifo_in; i++) { + if(core_fifo_in[i]==core_id) { + if(j==source_id) { + fifo_id = i; + fifo_ok=true; + } + j++; + } + } + + if(fifo_ok) { + EXPRINT(ni, 1,"Receive accept data from fifo: " << fifo_id); //FIXPRINT + tab_fifo_in_accept[fifo_id] = true; + //Requires to update the accept_data (Ivan) + accept_data_update = true; + } else { + EXPRINT(ni, 0,"ERROR : invalid source id " << source_id << " for accept data from CORE " << core_id ); + exit(0); + } + +} + +/*******************************************************************************/ +/*******************************************************************************/ +/// Write WRITE DATA transaction for fifo in +void anoc_copro_wrapper::write_data_fifo_in(int num_fifo, t_uint32 data) { +#ifdef _ANOC_COPRO_DEBUG + printf("WRITE DATA transaction\n"); +#endif + + ni_write_data_transaction data_trans; + data_trans.set_data(data); + EXPRINT(ni, 1,"Write data " << data << " in fifo_in[" << num_fifo << "]"); //FIXPRINT + ni_input_fifo_out[num_fifo]->put(&data_trans); + +} + +/*******************************************************************************/ +/*******************************************************************************/ +/// Receive STATUS transaction (remote call) +void anoc_copro_wrapper::put(const ni_status_transaction &transaction) { +#ifdef _ANOC_COPRO_DEBUG + printf("STATUS transaction\n"); +#endif + + t_uint16 core_id; + core_id = transaction.get_core_id(); + if(core_id>=nb_cores) { + EXPRINT(ni, 0,"ERROR : Invalid core id for status"); + exit(0); + } + + last_status[core_id] = transaction.get_status(); + //Requires to update the status port + status_update = true; + + EXPRINT(ni, 0,"New status from CORE " << core_id <<" : " << last_status[core_id]); //FIXPRINT + +} + +/*******************************************************************************/ +/*******************************************************************************/ +/// Receive EOC transaction (remote call) +void anoc_copro_wrapper::put(const ni_eoc_transaction &transaction) { +#ifdef _ANOC_COPRO_DEBUG + printf("EOC transaction\n"); +#endif + + t_uint16 core_id; + core_id = transaction.get_core_id(); + if(core_id>=nb_cores) { + EXPRINT(ni, 0,"ERROR : Invalid core_id for eoc"); + exit(0); + } + + EXPRINT(ni, 0,"CORE " << core_id << " has finished"); //FIXPRINT + cfg_flag_core_finished[core_id] = true; + //Requires to update the eoc + eoc_update = true; + +} + +/*******************************************************************************/ +/*******************************************************************************/ +// Update the RTL signals when a TLM transcation arrive +/// Sensitive_neg << p_clk +void anoc_copro_wrapper::tlm_to_rtl() { + //Output FIFOs + ////////////// + // The Data port need to be updated ? +// if (write_data_update == true) { +// printf("write_data_update, %i\n",(int)flag_tab_out_data_fifo_out[0]); +// for(int i=0; i<nb_fifo_out; i++) { +// p_to_MWMR[i].w = flag_tab_out_data_fifo_out[i]; +// p_to_MWMR[i].data = tab_out_data_fifo_out[i]; +// } +// //the Data is correctly updated +// write_data_update = false; +// } + //Input FIFOs + ///////////// + // The Accept port need to be updated ? +// if (accept_data_update == true) { +// for(int i=0; i<nb_fifo_in; i++) { +// p_from_MWMR[i].r = tab_fifo_in_accept[i]; +// } +// //the Data is correctly updated +// accept_data_update = false; +// } + //Status port + ///////////// + // The Accept port need to be updated ? + if (status_update == true) { + for (int i=0; i<nb_cores; i++) { + p_status[i+1] = last_status[i]; + } + status_update = false; + } + //EOC port + ///////////// + if (eoc_update == true) { + uint32_t value = 0; + for (int i=0; i<nb_cores; i++) { + if (cfg_flag_core_finished[i] == true) { + value += 1 << i; + } + } + p_status[0] = value; + eoc_update = false; + } + + //Core configuration + //////////////////// + p_core_config.r = true; + + //Start the rtl_to_tlm process + rtl_to_tlm_event.notify(clk_period/4,SC_PS); +} + + +/*******************************************************************************/ +/*******************************************************************************/ +// Generate a TLM transaction when the RTL signals change +/// Sensitive_pos << 3/4*p_clk +void anoc_copro_wrapper::rtl_to_tlm() { + + //Output FIFOs + ////////////// + //Test if a Send signal is active + for(int i=0; i<nb_fifo_out; i++) { + //A FIFO was ready to send data ? + p_to_MWMR[i].w = false; + if (flag_tab_out_data_fifo_out[i]) { + //Chech if the accept signal is High + if (p_to_MWMR[i].wok.read() == true) { + //The FIFO data is correcly transfered + p_to_MWMR[i].w = true; + p_to_MWMR[i].data = tab_out_data_fifo_out[i]; + + //Invalidate the send signal + flag_tab_out_data_fifo_out[i] = false; + //Requires to update the Data port + write_data_update = true; + //Send the TLM Accept transaction to the Core + if (tab_available_data_fifo_out[i] > 1 ) + write_data_accept_fifo_out(i); + } + } else if (tab_available_data_fifo_out[i] > 0 ) { + //New data can be read? + //Send the TLM Accept transaction to the Core + write_data_accept_fifo_out(i); + } + } + + //Input FIFOs + ///////////// + //Test if a new Data is present on the Input FIFOs + for(int i=0; i<nb_fifo_in; i++) { + p_from_MWMR[i].r = tab_fifo_in_accept[i]; + if (p_from_MWMR[i].rok.read() == true) { + //I am ready to accept this new data? + if (tab_fifo_in_accept[i] == true) { + //Read the data and send a TLM transcation + p_from_MWMR[i].r = true; + t_uint32 data = (t_uint32)p_from_MWMR[i].data.read(); + write_data_fifo_in(i, data); + //Lower the ROK signal + tab_fifo_in_accept[i] = false; + //Requires a Accept RTL port update + accept_data_update = true; + } + } + } + + //Exec port + /////////////// + //RTL signals changed? + if (exec_last != p_config[0].read()) { + ni_exec_transaction exec_trans; + //Test bit by bit to identify the source + for(int i=0; i<nb_cores; i++) { + if (((exec_last & (1<<i)) == 0) && ((p_config[0].read() & (1<<i)) == 1)) { + //A new lot_id is ready to be executed on core 'i' + EXPRINT(ni, 1,"CORE configuration event"); + //Get the slot_id + t_uint16 slot_id = (t_uint16)p_config[i+1].read(); + EXPRINT(ni, 0,"CORE " << i << " execute configuration on slot id " << slot_id); + // write exec config + exec_trans.set_slot_id(slot_id); + ni_exec_out[i]->put(&exec_trans); + //The CORE is nolonger finished + cfg_flag_core_finished[i] = false; + //Requires a RTL signal update + eoc_update = true; + } + } + exec_last = p_config[0].read(); + } + + //Core config address + ///////////////////// + if (last_address != p_config[5].read()) { + //The address have been changed + current_address = p_config[5].read(); + last_address = p_config[5].read(); + } + + + //Core configuration + //////////////////// + if (p_core_config.rok.read() == true) { + //A new configuration data is ready + ni_cfg_transaction cfg_trans; + t_uint32 data = p_core_config.data.read(); + cfg_trans.set_data(data); + cfg_trans.set_address(current_address); +#ifdef _ANOC_COPRO_DEBUG + printf("Ivan: Config data: %.8x on address %.8x\n", data, current_address); +#endif + ni_cfg_dump_out->put(&cfg_trans); + current_address++; + } + +} +}} + + diff --git a/MPSoC/soclib/soclib/module/streaming_component/my_hwa1/caba/source/src/my_hwa0.cpp b/MPSoC/soclib/soclib/module/streaming_component/my_hwa1/caba/source/src/my_hwa0.cpp new file mode 100644 index 0000000000000000000000000000000000000000..20c731c9d5a4204e2ff491696edde752f4e5637b --- /dev/null +++ b/MPSoC/soclib/soclib/module/streaming_component/my_hwa1/caba/source/src/my_hwa0.cpp @@ -0,0 +1,32 @@ + +namespace dsx { namespace caba { + + +#define tmpl(...) __VA_ARGS__ MyHWA0 + +tmpl(/**/)::~MyHWA0() +{ +} + + //intArray(1,1) there is one element (here an integer) of size 4 OCTETs/Quentin: attention cela a change c'est un MOT dans la version VM +tmpl(/**/)::MyHWA0(sc_core::sc_module_name insname) + :dsx::caba::FifoVirtualCoprocessorWrapper(insname, stringArray("output", NULL), intArray(1,4), stringArray(NULL), NULL) +{ +} + +tmpl(void *)::task_func() { + struct mwmr_s *output; +// mwmr_t output = SRL_GET_MWMR(output); + uint32_t data; + + while (true) { + for (int32_t i = 0; i < 8; i++) { + out=i; + mwmr_write(output, &data, 4; // Write integers 0 to 7 to output + } + + } +} + +}} + diff --git a/MPSoC/soclib/soclib/module/streaming_component/my_hwa1/caba/source/src/my_hwa1.cpp b/MPSoC/soclib/soclib/module/streaming_component/my_hwa1/caba/source/src/my_hwa1.cpp new file mode 100644 index 0000000000000000000000000000000000000000..b6ba89a325d62f5c2009f176d3cea9831392cfd9 --- /dev/null +++ b/MPSoC/soclib/soclib/module/streaming_component/my_hwa1/caba/source/src/my_hwa1.cpp @@ -0,0 +1,31 @@ + +namespace dsx { namespace caba { + + +#define tmpl(...) __VA_ARGS__ MyHWA1 + +tmpl(/**/)::~MyHWA1() +{ +} + + //intArray(1,1) there is one element (here an integer) of size 4 OCTETs/Quentin: attention cela a change c'est un MOT dans la version VM + +tmpl(/**/)::MyHWA1(sc_core::sc_module_name insname) + :dsx::caba::FifoVirtualCoprocessorWrapper(insname, stringArray(NULL), NULL, stringArray("input", NULL), intArray(1,4)) +{ +} + +tmpl(void *)::task_func() { + struct mwmr_s *input; + uint32_t data; + + while (true) { + for (int32_t i = 0; i < 8; i++) { + mwmr_read(input, &data, 1); // read 8 integers wich have been modified by the intermediate software task + } + + } +} + +}} + diff --git a/build.txt b/build.txt index 70aa78a348c94ed74732bc4e9371f11cde2878dc..f283b3d48342e9c0b6d235fe41abe6e5a3cac3a4 100644 --- a/build.txt +++ b/build.txt @@ -1 +1 @@ -12340 \ No newline at end of file +12357 \ No newline at end of file diff --git a/src/main/java/avatartranslator/AvatarBlock.java b/src/main/java/avatartranslator/AvatarBlock.java index f4119dcb17b453990c736abac19f76551fc4ba03..0053bc1dd849167e8926ecb0735bc1ac5d59e212 100644 --- a/src/main/java/avatartranslator/AvatarBlock.java +++ b/src/main/java/avatartranslator/AvatarBlock.java @@ -133,12 +133,11 @@ public class AvatarBlock extends AvatarElement implements AvatarStateMachineOwne } public AvatarSignal getSignalByName(String _name) { - for(AvatarSignal sig: signals) { - System.out.println("finding " +sig.getName() + " " + _name); - if (sig.getName().compareTo(_name) == 0) { - return sig; - } - } + for(AvatarSignal sig: signals) { + if (sig.getName().compareTo(_name) == 0) { + return sig; + } + } if (father != null) { return father.getSignalByName(_name); diff --git a/src/main/java/ddtranslatorSoclib/AvatarCoproMWMR.java b/src/main/java/ddtranslatorSoclib/AvatarCoproMWMR.java index 0850154bc4b493c68a75d35174e62bc109f4be13..c578f610e4a26018be7587e23cf7aceb815abb67 100755 --- a/src/main/java/ddtranslatorSoclib/AvatarCoproMWMR.java +++ b/src/main/java/ddtranslatorSoclib/AvatarCoproMWMR.java @@ -53,7 +53,7 @@ public class AvatarCoproMWMR extends AvatarComponent{ private int tgtid ; private int plaps ; private int fifoToCoprocDepth; - private int fifoFromCoproDepth; + private int fifoFromCoprocDepth; private int nToCopro; private int nFromCopro; private int nConfig; @@ -63,14 +63,14 @@ public class AvatarCoproMWMR extends AvatarComponent{ private AvatarConnectingPoint[] connectingsPoints; private int nbConnectingPoint = 16 ; - public AvatarCoproMWMR(String _coprocName,int srcid, int _srcid, int _tgtid, int _plaps, int _fifoToCoprocDepth,int _fifoFromCoproDepth, int _nToCopro, int _nFromCopro, int _nConfig, int _nStatus, boolean _useLLSC) + public AvatarCoproMWMR(String _coprocName,int srcid, int _srcid, int _tgtid, int _plaps, int _fifoToCoprocDepth,int _fifoFromCoprocDepth, int _nToCopro, int _nFromCopro, int _nConfig, int _nStatus, boolean _useLLSC) { coprocName = _coprocName; srcid = _srcid; tgtid = _tgtid; plaps = _plaps ; fifoToCoprocDepth = _fifoToCoprocDepth; - fifoFromCoproDepth = _fifoFromCoproDepth; + fifoFromCoprocDepth = _fifoFromCoprocDepth; nToCopro = _nToCopro; nFromCopro = _nFromCopro; nConfig = _nConfig; @@ -109,10 +109,14 @@ public class AvatarCoproMWMR extends AvatarComponent{ return plaps; } - public int getFifoToCoProcDepth(){ + public int getFifoToCoprocDepth(){ return fifoToCoprocDepth; } + public int getFifoFromCoprocDepth(){ + return fifoFromCoprocDepth; + } + public int getNToCopro(){ return nToCopro; } diff --git a/src/main/java/ddtranslatorSoclib/AvatarTask.java b/src/main/java/ddtranslatorSoclib/AvatarTask.java index 0740aec7c5ef47ad6207522b11962cb5cf068b6b..8da5799e9738e6273aa1dd85a3907949e6c3f781 100755 --- a/src/main/java/ddtranslatorSoclib/AvatarTask.java +++ b/src/main/java/ddtranslatorSoclib/AvatarTask.java @@ -52,8 +52,8 @@ package ddtranslatorSoclib; public class AvatarTask extends AvatarMappedObject{ private AvatarCPU avatarCPUReference; - private String taskName ; - private String referenceTaskName; + private String taskName ; + private String referenceTaskName; public AvatarTask(String _taskName , String _referenceTaskName, AvatarCPU _avatarCPUReference ){ diff --git a/src/main/java/ddtranslatorSoclib/AvatarddSpecification.java b/src/main/java/ddtranslatorSoclib/AvatarddSpecification.java index 9da15a45d50b487a7223eb12a7d289ee21eb98db..05d1bf870ea61d2af4e3a0949b887f7fc66d5e24 100755 --- a/src/main/java/ddtranslatorSoclib/AvatarddSpecification.java +++ b/src/main/java/ddtranslatorSoclib/AvatarddSpecification.java @@ -49,9 +49,8 @@ package ddtranslatorSoclib; import java.util.LinkedList; import java.util.List; - +import ui.tmldd.TMLArchiHWANode;//DG 23.08. public class AvatarddSpecification{ - private List<AvatarComponent> components; private List<AvatarConnector> connectors; private List<AvatarMappedObject> mappedObjects; @@ -195,7 +194,7 @@ There always is a RAM0, a TTY and an interconnect (Bus or VGMN or crossbar) othe return crossbars; } - /* public LinkedList<AvatarBridge> getAllBridge(){ + /* public LinkedList<AvatarBridge> getAllBridge(){ LinkedList<AvatarBridge> bridges = new LinkedList<AvatarBridge>(); for (AvatarComponent bridge : components ) { @@ -212,16 +211,37 @@ There always is a RAM0, a TTY and an interconnect (Bus or VGMN or crossbar) othe return getAllCrossbar().size(); } - public List<AvatarCoproMWMR> getAllCoproMWMR(){ + /* DG 23.08. les hardware accelerators proviennent en fait de la specification DIPLODOCUS */ + + // copro= new AvatarCoproMWMR("test",0,0,0,10,8,8,1,1,1,1,false); + + public List<AvatarCoproMWMR> getAllCoproMWMR(){ List<AvatarCoproMWMR> copros = new LinkedList<AvatarCoproMWMR>(); for (AvatarComponent copro : components ) { - if (copro instanceof AvatarCoproMWMR) - copros.add((AvatarCoproMWMR)copro); + if (copro instanceof AvatarCoproMWMR){ + System.out.println("Coproc added to specification"); + copros.add((AvatarCoproMWMR)copro); + } } return copros; - } + } + + /* to do, actuellement c'est un hwa generique */ + /* the hardware accelerators must be taken from DIPLODOCUS specification */ + /* public List<DiploHWA> getAllHWA(){ + List<DiploHWA> hwas = new LinkedList<DiploHWA>(); + for (DiploComponent hwa : diplocomponents ) + { + if (hwa instanceof DiploHWA){ + System.out.println("Hardware accelerator added to specification"); + + hwas.add((DiploHWA)hwa); + } + } + return hwas; + }*/ public int getNbCPU(){ return (getAllCPU()).size(); diff --git a/src/main/java/ddtranslatorSoclib/toSoclib/TasksAndMainGenerator.java b/src/main/java/ddtranslatorSoclib/toSoclib/TasksAndMainGenerator.java index 965c8c8daaad94a26b3d3132f6c3acda437e1ca6..b4f2edf4d80629425e12956a75eed7be4fbe62a0 100755 --- a/src/main/java/ddtranslatorSoclib/toSoclib/TasksAndMainGenerator.java +++ b/src/main/java/ddtranslatorSoclib/toSoclib/TasksAndMainGenerator.java @@ -1033,6 +1033,26 @@ public class TasksAndMainGenerator { mainFile.appendToMainCode("/* Activating randomness */" + CR); mainFile.appendToMainCode("initRandom();" + CR); + /* DG 7.9.2017 additions for use of hardware MWMR controller */ + + + /*void mwmr_hw_init( void *coproc, enum SoclibMwmrWay way, + size_t no, const struct mwmr_s* mwmr );*/ + + /*uint32_t *fifo_data_in = (uint32_t*)(base(MWMRd)+0x000); //0x20200000;*/ + /* uint32_t *lock_in = (uint32_t*)(base(LOCKS)+0x00);*/ + /* mwmr_t *p_mwmr_in = (mwmr_t*)(base(MWMRd)+0x1000);*/ + + +/*mwmr_initialize_pointer(p_mwmr_in, WIDTH, DEPTH, fifo_data_in, lock_in );*/ + +/* mwmr_hw_init(base(MWMR), MWMR_TO_COPROC, 0 , p_mwmr_in);*/ + +/*for all coproc + uint32_t *fifo = (uint32_t*) + i*4096;*/ + +/* end ajoute 7.9. */ + mainFile.appendToMainCode("/* Initializing the main mutex */" + CR); mainFile.appendToMainCode("if (pthread_mutex_init(&__mainMutex, NULL) < 0) { exit(-1);}" + CR + CR); diff --git a/src/main/java/ddtranslatorSoclib/toTopCell/Declaration.java b/src/main/java/ddtranslatorSoclib/toTopCell/Declaration.java index a0c186bbb826455d9538b92f0432f4159f23dd7a..682a8098a3fa20f99306db0cfbdc830cc56ef1cd 100755 --- a/src/main/java/ddtranslatorSoclib/toTopCell/Declaration.java +++ b/src/main/java/ddtranslatorSoclib/toTopCell/Declaration.java @@ -114,22 +114,25 @@ public class Declaration { declaration += "caba::VciFdtRom<vci_param> vcifdtrom(\"vci_fdt_rom\", IntTab(0,6), maptab);" + CR; } - if(nb_clusters==0){ - declaration += "caba::VciLocks<vci_param> vcilocks(\"vcilocks\", IntTab("+(TopCellGenerator.avatardd.getNb_target()+3)+"), maptab);" + CR; - } - else{ - declaration += "caba::VciLocks<vci_param> vcilocks(\"vcilocks\", IntTab(0,8), maptab);" + CR; - } - + int last_tty=0; if(nb_clusters==0){ int i=0; for (AvatarTTY tty : TopCellGenerator.avatardd.getAllTTY()){ declaration += "caba::VciMultiTty<vci_param> " + tty.getTTYName()+ "(\"" + tty.getTTYName()+ "\", IntTab(" + tty.getNo_target()+ "), maptab, \"vci_multi_tty"+i+"\", NULL);"+ CR; i++; + last_tty=tty.getNo_target()+1; } //target address depends on number of TTYs and RAMs + if(nb_clusters==0){ + // declaration += "caba::VciLocks<vci_param> vcilocks(\"vcilocks\", IntTab("+(TopCellGenerator.avatardd.getNb_target()+3)+"), maptab);" + CR; + declaration += "caba::VciLocks<vci_param> vcilocks(\"vcilocks\", IntTab("+(last_tty+3)+"), maptab);" + CR; + } + else{ + declaration += "caba::VciLocks<vci_param> vcilocks(\"vcilocks\", IntTab(0,8), maptab);" + CR; + } + for (AvatarRAM ram : TopCellGenerator.avatardd.getAllRAM()) if(ram.getIndex()==0){ declaration += "soclib::caba::VciRam<vci_param>" + ram.getMemoryName()+ "(\"" + ram.getMemoryName()+ "\"" + ", IntTab(2), maptab);" + CR; @@ -150,9 +153,35 @@ public class Declaration { + ram.getNo_target() + "), maptab);" + CR2; } if(nb_clusters==0){ - declaration += "caba::VciFdAccess<vci_param> vcifd(\"vcifd\", maptab, IntTab(cpus.size()+1), IntTab("+(TopCellGenerator.avatardd.getNb_target())+"));" + CR; + /*declaration += "caba::VciFdAccess<vci_param> vcifd(\"vcifd\", maptab, IntTab(cpus.size()+1), IntTab("+(TopCellGenerator.avatardd.getNb_target())+"));" + CR; declaration += "caba::VciEthernet<vci_param> vcieth(\"vcieth\", maptab, IntTab(cpus.size()+2), IntTab("+(TopCellGenerator.avatardd.getNb_target()+1)+"), \"soclib0\");" + CR; - declaration += "caba::VciBlockDevice<vci_param> vcibd(\"vcibd\", maptab, IntTab(cpus.size()), IntTab("+(TopCellGenerator.avatardd.getNb_target()+2)+"),\"block0.iso\", 2048);" + CR; + declaration += "caba::VciBlockDevice<vci_param> vcibd(\"vcibd\", maptab, IntTab(cpus.size()), IntTab("+(TopCellGenerator.avatardd.getNb_target()+2)+"),\"block0.iso\", 2048);" + CR;*/ + +declaration += "caba::VciFdAccess<vci_param> vcifd(\"vcifd\", maptab, IntTab(cpus.size()+1), IntTab("+last_tty +"));" + CR; + declaration += "caba::VciEthernet<vci_param> vcieth(\"vcieth\", maptab, IntTab(cpus.size()+2), IntTab("+(last_tty +1)+"), \"soclib0\");" + CR; + declaration += "caba::VciBlockDevice<vci_param> vcibd(\"vcibd\", maptab, IntTab(cpus.size()), IntTab("+(last_tty +2)+"),\"block0.iso\", 2048);" + CR; + + //only non-clustered version + int hwa_no=0; + //int target_no = TopCellGenerator.avatardd.getNb_target(); + int target_no = (last_tty +4);//DG 5.9. + int init_no = TopCellGenerator.avatardd.getNb_init(); + for (AvatarCoproMWMR copro : TopCellGenerator.avatardd.getAllCoproMWMR()){ + // declaration += "caba::VciMwmrController<vci_param> " + copro.getCoprocName()+ "(\"" + copro.getCoprocName()+ "\", maptab, IntTab("+copro.getSrcid() + "), IntTab("+copro.getTgtid() + "),copro.getPlaps(),copro.getFifoToCoProcDepth(),copro.getNToCopro(),copro.getNFromCopro(),copro.getNConfig(),copro.getNStatus(), copro.getUseLLSC());"+ CR; + + declaration += "caba::VciMwmrController<vci_param> " + copro.getCoprocName()+ "(\"" + copro.getCoprocName()+ "\", maptab, IntTab("+(init_no-1)+"), IntTab("+target_no+ "),"+copro.getPlaps()+","+copro.getFifoToCoprocDepth()+","+copro.getFifoFromCoprocDepth()+","+copro.getNToCopro()+","+copro.getNFromCopro()+","+copro.getNConfig()+","+copro.getNStatus()+","+ copro.getUseLLSC()+");"+ CR2; + +//one virtual component for each hardware accellerator, info from diplodocus (not yet implemented) + +//DG 28.08. + // declaration += "soclib::caba::FifoVirtualCoprocessorWrapper hwa"+hwa_no+"(\"hwa"+hwa_no+"\",1,1,1,1);"+ CR2; + +declaration += "dsx::caba::MyHWA"+hwa_no+" hwa"+hwa_no+"(\"hwa"+hwa_no+"\");"+ CR2; + target_no++; + init_no++; + hwa_no++; + } + }else{ declaration += "caba::VciFdAccess<vci_param> vcifd(\"vcifd\", maptab, IntTab(0,cpus.size()+1), IntTab(0,7));" + CR; declaration += "caba::VciEthernet<vci_param> vcieth(\"vcieth\", maptab, IntTab(0,cpus.size()+2), IntTab(0,8), \"soclib0\");" + CR; @@ -160,12 +189,15 @@ public class Declaration { } if(nb_clusters==0){ + for (AvatarBus bus : TopCellGenerator.avatardd.getAllBus()) { System.out.println("initiators: "+TopCellGenerator.avatardd.getNb_init()); System.out.println("targets: "+TopCellGenerator.avatardd.getNb_target()); //declaration += "soclib::caba::VciVgsb<vci_param> vgsb(\"" + bus.getBusName() + "\"" + " , maptab, cpus.size()+3," + (TopCellGenerator.avatardd.getNb_target()+4)+");" + CR2; - declaration += "soclib::caba::VciVgsb<vci_param> vgsb(\"" + bus.getBusName() + "\"" + " , maptab, cpus.size()+3," + (TopCellGenerator.avatardd.getNb_target()+4)+ ");" + CR2; + // declaration += "soclib::caba::VciVgsb<vci_param> vgsb(\"" + bus.getBusName() + "\"" + " , maptab, cpus.size()+3," + (TopCellGenerator.avatardd.getNb_target()+4)+ ");" + CR2; + + declaration += "soclib::caba::VciVgsb<vci_param> vgsb(\"" + bus.getBusName() + "\"" + " , maptab,"+(3+TopCellGenerator.avatardd.getNb_init())+"," + (TopCellGenerator.avatardd.getNb_target()+4)+ ");" + CR2;//DG 28.08. int i=0; //if BUS was not last in input file, update here @@ -185,7 +217,10 @@ if(nb_clusters==0){ vgmn.setFifoDepth(8); //default value; must be > 2 - declaration += "soclib::caba::VciVgmn<vci_param> vgmn(\"" + vgmn.getVgmnName() + "\"" + " , maptab, cpus.size()+3," + (TopCellGenerator.avatardd.getNb_target()+4)+ "," + vgmn.getMinLatency() + "," + vgmn.getFifoDepth() + ");" + CR2; + // declaration += "soclib::caba::VciVgmn<vci_param> vgmn(\"" + vgmn.getVgmnName() + "\"" + " , maptab, cpus.size()+3," + (TopCellGenerator.avatardd.getNb_target()+4)+ "," + vgmn.getMinLatency() + "," + vgmn.getFifoDepth() + ");" + CR2; + // declaration += "soclib::caba::VciVgmn<vci_param> vgmn(\"" + vgmn.getVgmnName() + "\"" + " , maptab, " +(3+TopCellGenerator.avatardd.getNb_init())+"," + (TopCellGenerator.avatardd.getNb_target()+4)+ "," + vgmn.getMinLatency() + "," + vgmn.getFifoDepth() + ");" + CR2;//DG 28.08. + + declaration += "soclib::caba::VciVgmn<vci_param> vgmn(\"" + vgmn.getVgmnName() + "\"" + " , maptab, " +(3+TopCellGenerator.avatardd.getNb_init())+"," + (TopCellGenerator.avatardd.getNb_target()+3)+ "," + vgmn.getMinLatency() + "," + vgmn.getFifoDepth() + ");" + CR2;//DG 5.9. // declaration += "soclib::caba::VciVgmn<vci_param> vgmn(\"" + vgmn.getVgmnName() + "\"" + " , maptab, cpus.size()+3," + (TopCellGenerator.avatardd.getNbRAM()+TopCellGenerator.avatardd.getNbTTY()+4)+ "," + vgmn.getMinLatency() + "," + vgmn.getFifoDepth() + ");" + CR2; @@ -212,11 +247,7 @@ if(nb_clusters==0){ const bool use_llsc ); */ - //only non-clustered version - for (AvatarCoproMWMR copro : TopCellGenerator.avatardd.getAllCoproMWMR()){ - declaration += "caba::VciMwmrController<vci_param> " + copro.getCoprocName()+ "(\"" + copro.getCoprocName()+ "\", maptab, IntTab("+copro.getSrcid() + "), IntTab("+copro.getTgtid() + "),copro.getPlaps(),copro.getFifoToCoProcDepth(),copro.getNToCopro(),copro.getNFromCopro(),copro.getNConfig(),copro.getNStatus(), copro.getUseLLSC());"+ CR; - - } + } else { @@ -266,7 +297,6 @@ else { declaration += "soclib::caba::VciLocalCrossbar<vci_param> crossbar"+crossbar.getClusterIndex()+"(\"" + crossbar.getCrossbarName() + "\"" + " , maptab, IntTab("+ crossbar.getClusterIndex()+"),IntTab("+crossbar.getClusterIndex()+"), "+crossbar.getNbOfAttachedInitiators()+", "+crossbar.getNbOfAttachedTargets()+");" + CR2; - //if CROSSBAR was not last in input file, update here crossbar.setNbOfAttachedInitiators(TopCellGenerator.avatardd.getNb_init()); crossbar.setNbOfAttachedTargets(TopCellGenerator.avatardd.getNb_target()); diff --git a/src/main/java/ddtranslatorSoclib/toTopCell/Deployinfo.java b/src/main/java/ddtranslatorSoclib/toTopCell/Deployinfo.java index 9c55b3fd3a937c958939dbcf5e24f759cb9c4102..42871f9d6a8582d7a46fcef32e4053161948329e 100755 --- a/src/main/java/ddtranslatorSoclib/toTopCell/Deployinfo.java +++ b/src/main/java/ddtranslatorSoclib/toTopCell/Deployinfo.java @@ -174,6 +174,16 @@ public class Deployinfo { i++; } + //Calculate Adresses of MWMR segments, one for each hardware accellerator + i=0; + + for (AvatarCoproMWMR copro : TopCellGenerator.avatardd.getAllCoproMWMR()) { + deployinfo = deployinfo + "#define MWMR_RAM" + i + "_NAME mwmr_ram" + i + CR; + deployinfo = deployinfo + "#define MWMR_RAM" + i + "_ADDR 0xA02" + Integer.toHexString(i*4096) + CR; + deployinfo = deployinfo + "#define MWMR_RAM" + i + "_SIZE 0x1000"+ CR; + i++; + } + return deployinfo; } diff --git a/src/main/java/ddtranslatorSoclib/toTopCell/Header.java b/src/main/java/ddtranslatorSoclib/toTopCell/Header.java index 18cb9813c130afdfd1bfe8e41bba2c8424c31663..58f799ce3caba235c97e9ba3a4a4cf6a6e322d50 100755 --- a/src/main/java/ddtranslatorSoclib/toTopCell/Header.java +++ b/src/main/java/ddtranslatorSoclib/toTopCell/Header.java @@ -48,6 +48,8 @@ package ddtranslatorSoclib.toTopCell; +import ddtranslatorSoclib.*; //DG 23.08. + public class Header { static private String header; @@ -89,7 +91,32 @@ int nb_clusters=5; else{ header +="#include \"vci_vgmn.h\""+ CR; } - + int with_hw_accellerator = 1; //DG 23.08. a la main + if (with_hw_accellerator>0){ + header +="#include \"vci_mwmr_controller.h\""+ CR; + } + //include statements for all coprocessors found + //The user must ensure that there is a SoCLib component corresponding to this coprocessor + // if (with_hw_accellerator>0){ + //DG 23.08. actuellement il ne les trouve pas! + int hwas=0; + header +="#include \"fifo_virtual_copro_wrapper.h\""+ CR; + + for (AvatarCoproMWMR HWAccelerator : TopCellGenerator.avatardd.getAllCoproMWMR()) { + // String name = HWAccelerator.getCoprocName(); + // header +="#include \""+name+"\""+ CR; + + //Per default for testing + // header +="#include \"input_coproc.h\""+ CR; + //header +="#include \"output_coproc.hh\""+ CR; + + /* can be found in /users/outil/soc/soclib/soclib/module/internal_component/fifo* */ + //header +="#include \"fifo_virtual_copro_wrapper.h\""+ CR; + header +="#include \"my_hwa"+hwas+".h\""+ CR; + hwas++; + } + // } + header+= "#include \"vci_block_device.h\"" + CR + "#include \"vci_simhelper.h\"" + CR + "#include \"vci_fd_access.h\"" + CR + "#include \"vci_ethernet.h\"" + CR diff --git a/src/main/java/ddtranslatorSoclib/toTopCell/MappingTable.java b/src/main/java/ddtranslatorSoclib/toTopCell/MappingTable.java index eed6d66c70151e0b0ea8f604a13a00fffac3f180..871c0b60449c6d65f119965bbd5a17b24dc5eba5 100755 --- a/src/main/java/ddtranslatorSoclib/toTopCell/MappingTable.java +++ b/src/main/java/ddtranslatorSoclib/toTopCell/MappingTable.java @@ -51,6 +51,7 @@ package ddtranslatorSoclib.toTopCell; import ddtranslatorSoclib.AvatarRAM; import ddtranslatorSoclib.AvatarTTY; +import ddtranslatorSoclib.*; public class MappingTable { @@ -117,7 +118,7 @@ public class MappingTable { size = 1073741824; } else {//dimension segments to be smaller - size = 268435456; + size = 268435456; } } else{ @@ -167,6 +168,25 @@ public class MappingTable { mapping = mapping + "maptab.add(Segment(\"vci_block_device\", 0xd1200000, 0x00000020, IntTab("+(l+3)+"), false));" + CR2; mapping = mapping + "maptab.add(Segment(\"vci_locks\", 0xC0200000, 0x00000100, IntTab("+(l+4)+"), false));" + CR2; + + /* Instanciation of the MWMR wrappers for hardware accellerators */ + /* The accelerators themselves are specifies on DIPLODOCUS level */ + + int hwa_count=0; + int MWMR_SIZE=4096; + // int MWMR_BASE=0xA0200000; + i=0; + for (AvatarCoproMWMR MWMRwrapper : TopCellGenerator.avatardd.getAllCoproMWMR()) { + mapping += "maptab.add(Segment(\"mwmr_ram"+hwa_count+"\", 0xA0"+ Integer.toHexString(2097152+MWMR_SIZE*i)+", 0x00001000, IntTab("+(l+5+hwa_count)+"), false));" + CR; + hwa_count++; + } + hwa_count=0; + /* + for (AvatarCoproMWMR MWMRwrapper : TopCellGenerator.avatardd.getAllCoproMWMR()) { + mapping += "maptab.add(Segment(\"mwmr_ram"+hwa_count+"\", 0x"+(Integer.toHexString(MWMRd_BASE+i*4096))+", 0x"+Integer.toHexString(MWMRd_SIZE)+", IntTab("+(l+5+hwa_count)+"), false));" + CR2; + hwa_count++; + } */ + return mapping; } @@ -262,7 +282,11 @@ mapping += "maptab.add(Segment(\"vci_rttimer\", 0x"+ Integer.toHexString(SEG_TIM tty.setNo_target(nb_ram); } mapping += "maptab.add(Segment(\"vci_multi_tty"+tty.getIndex()+"\" , 0x"+Integer.toHexString(SEG_TTY_BASE + tty.getNo_cluster()* CLUSTER_SIZE)+", 0x00000010, IntTab("+tty.getNo_cluster()+","+(tty.getNo_target())+"), false));" + CR; - } + } + /* Add as manin mwmr controllers as there are hardware accelerators */ + //int with_hw_accelerator = 0; //DG 23.08. + +// } } return mapping; } diff --git a/src/main/java/ddtranslatorSoclib/toTopCell/NetList.java b/src/main/java/ddtranslatorSoclib/toTopCell/NetList.java index 74870d23ee8af377e4bed015477f95024caafd69..5299c2125def2d1157fdf37d45d25b4d8313a73f 100755 --- a/src/main/java/ddtranslatorSoclib/toTopCell/NetList.java +++ b/src/main/java/ddtranslatorSoclib/toTopCell/NetList.java @@ -341,16 +341,23 @@ public class NetList { // if(nb_cluster == 0){ i=0; for (AvatarCoproMWMR copro : TopCellGenerator.avatardd.getAllCoproMWMR()){ - //a coprocessor with FIFO interface - netlist = netlist +copro.getCoprocName()+".p_clk(signal_clk);" + CR; - netlist = netlist +copro.getCoprocName()+".p_resetn(signal_resetn);" + CR; - netlist = netlist + copro.getCoprocName()+".p_"+i+"_ctrl(signal_fifo_"+i+"_ctrl);" + CR; - //and its mwmr controller - netlist = netlist + "mwmr"+i+".p_clk(signal_clk);" + CR; - netlist = netlist + "mwmr"+i+".p_resetn(signal_resetn);" + CR; - netlist = netlist + "mwmr"+i+".p_vci_initiator(signal_mwmr_"+i+"initiator);" + CR; - netlist = netlist + "mwmr"+i+".p_vci_target(signal_mwmr_"+i+"_target);" + CR; - netlist = netlist + copro.getCoprocName()+".p_"+i+"_ctrl(signal_fifo_"+i+"_ctrl);" + CR; + //a coprocessor with its FIFO interface built from HWA + netlist = netlist +"hwa"+i+".p_clk(signal_clk);" + CR; + netlist = netlist +"hwa"+i+".p_resetn(signal_resetn);" + CR; + netlist = netlist +"hwa"+i+".p_from_ctrl["+i+"](signal_fifo_"+i+"_from_ctrl);" + CR; + netlist = netlist +"hwa"+i+".p_to_ctrl["+i+"](signal_fifo_"+i+"_to_ctrl);" + CR2; + + //MWMR controller of the HWA + netlist = netlist +copro.getCoprocName() +".p_clk(signal_clk);" + CR; + netlist = netlist +copro.getCoprocName() +".p_resetn(signal_resetn);" + CR; + netlist = netlist +copro.getCoprocName() +".p_vci_initiator(signal_mwmr_"+i+"_initiator);" + CR; + netlist = netlist + copro.getCoprocName()+".p_vci_target(signal_mwmr_"+i+"_target);" + CR2; + netlist = netlist +copro.getCoprocName() +".p_from_coproc["+i+"](signal_fifo_"+i+"_from_ctrl);" + CR; +netlist = netlist +copro.getCoprocName() +".p_to_coproc["+i+"](signal_fifo_"+i+"_to_ctrl);" + CR; +//DG 5.9. +// netlist = netlist +copro.getCoprocName() +".status();" + CR; +// netlist = netlist +copro.getCoprocName() +".config();" + CR; +i++; } @@ -389,6 +396,27 @@ public class NetList { } } } + + //if (with_hw_accellerator>0){ + + int p=0; + //for testing: vci_synthetic_initiator.h and vci_synthetic_target.h + //for (AvatarCoproMWMR HWAccelerator : TopCellGenerator.avatardd.getAllCoproMWMR()) { + /* netlist += "mwmr"+HWAccelerator.getNo()+".p_clk(signal_clk);" + CR; + netlist += "mwmr"+HWAccelerator.getNo()+".p_resetn(signal_resetn);" + CR; + netlist += "mwmr"+HWAccelerator.getNo()+".p_vci_initiator(signal_mwmr"+HWAccelerator.getNo()+"_initiator);" + CR; + netlist += " mwmr"+HWAccelerator.getNo()+".p_vci_target(signal_mwmr"+HWAccelerator.getNo()+"_target);" + CR; + netlist += " mwmr"+HWAccelerator.getNo()+".p_from_coproc["+HWAccelerator.getNo()+"](signal_fifo_to_ctrl);" + CR; + netlist += " mwmr"+HWAccelerator.getNo()+".p_to_coproc["+HWAccelerator.getNo()+"](signal_fifo_from_ctrl);" + CR;*/ + + /* netlist += "mwmr"+p+".p_clk(signal_clk);" + CR; + netlist += "mwmr"+p+".p_resetn(signal_resetn);" + CR; + netlist += "mwmr"+p+".p_vci_initiator(signal_mwmr"+p+"_initiator);" + CR; + netlist += " mwmr"+p+".p_vci_target(signal_mwmr"+p+"_target);" + CR; + netlist += " mwmr"+p+".p_from_coproc["+p+"](signal_fifo_"+p+"_to_ctrl);" + CR; + netlist += " mwmr"+p+".p_to_coproc["+p+"](signal_fifo_"+p+"_from_ctrl);" + CR; + } */ +// } //generate trace file if marked trace option diff --git a/src/main/java/ddtranslatorSoclib/toTopCell/Platforminfo.java b/src/main/java/ddtranslatorSoclib/toTopCell/Platforminfo.java index d76c8bdffc751d8beb1f245d979a9179b2dd5630..29a8d45b409a58c974a47189176d2fd7da18d249 100755 --- a/src/main/java/ddtranslatorSoclib/toTopCell/Platforminfo.java +++ b/src/main/java/ddtranslatorSoclib/toTopCell/Platforminfo.java @@ -56,6 +56,8 @@ public class Platforminfo { public static String getPlatformInfo() { //determine if the platform is vgsb or vgmn based (mutually exclusive) int with_vgsb=TopCellGenerator.avatardd.getAllBus().size(); + int nb_hwa=TopCellGenerator.avatardd.getAllCoproMWMR().size(); + //bus can be other than VGSB (CAN...), for the moment restricted to VGSB String platforminfo = CR; platforminfo +="use = ["+CR @@ -78,10 +80,17 @@ public class Platforminfo { platforminfo+="Uses('caba:vci_vgmn'),"+CR; } + //DG 23.08. added virtual coprocessor platforminfo+="Uses('caba:vci_mwmr_stats'),"+CR +"Uses('caba:vci_logger'),"+CR - +"Uses('caba:vci_local_crossbar'),"+CR - +"Uses('common:elf_file_loader'),"+CR + +"Uses('caba:vci_local_crossbar'),"+CR + +"Uses('caba:fifo_virtual_copro_wrapper'),"+CR ; + //DG 28.08. example coprocessors + int i=0; + for(i=0;i<nb_hwa;i++){ + platforminfo+="Uses('caba:my_hwa"+i+"'),"+CR; + } + platforminfo+="Uses('common:elf_file_loader'),"+CR +"Uses('common:plain_file_loader'),"+CR +"Uses('caba:vci_xcache_wrapper', iss_t = 'common:gdb_iss', gdb_iss_t = 'common:iss_memchecker', iss_memchecker_t = 'common:ppc405'),"+CR +"Uses('caba:vci_xcache_wrapper', iss_t = 'common:gdb_iss', gdb_iss_t = 'common:iss_memchecker', iss_memchecker_t = 'common:arm'),"+CR diff --git a/src/main/java/ddtranslatorSoclib/toTopCell/Signal.java b/src/main/java/ddtranslatorSoclib/toTopCell/Signal.java index 73ecb81e10452be786ef97ad04e5a0191b506473..f447924aed04d48f1e440403cf10db655e5a462e 100755 --- a/src/main/java/ddtranslatorSoclib/toTopCell/Signal.java +++ b/src/main/java/ddtranslatorSoclib/toTopCell/Signal.java @@ -88,7 +88,9 @@ signal = signal +"caba::VciSignals<vci_param> signal_vci_vcilocks(\"signal_vci_v for (AvatarCoproMWMR copro : TopCellGenerator.avatardd.getAllCoproMWMR()){ signal = signal +"caba::VciSignals<vci_param> signal_mwmr_"+i+"_initiator;"+ CR; signal = signal +"caba::VciSignals<vci_param> signal_mwmr_"+i+"_target;"+ CR; - signal = signal +"caba::VciSignals<vci_param> signal_fifo_"+i+"_ctrl;"+ CR; + signal = signal +" soclib::caba::FifoSignals<uint32_t> signal_fifo_"+i+"_from_ctrl;"+ CR; + signal = signal +" soclib::caba::FifoSignals<uint32_t> signal_fifo_"+i+"_to_ctrl;"+ CR; + i++; } if(TopCellGenerator.avatardd.getAllCrossbar().size()==0){ @@ -116,8 +118,26 @@ else{ signal = signal + "soclib::caba::VciSignals<vci_param> signal_vci_tty"+i+"(\"signal_vci_tty"+i+"\");" + CR2; i++; } - - signal = signal + " sc_core::sc_signal<bool> signal_xicu_irq[xicu_n_irq];" + CR2; + int p=0; + // if (with_hw_accellerator>0){ //DG 23.08. +for (AvatarCoproMWMR HWAccelerator : TopCellGenerator.avatardd.getAllCoproMWMR()) { +//les accellerateurs sont caches car apparaissent uniquement au niveau DIPLODOCUS +//signal = signal + " soclib::caba::VciSignals<vci_param> signal_mwmr"+HWAccelerator.getNo()+"_target(\"signal_mwmr"+HWAccelerator.getNo()+"_target\""+CR; +//signal = signal + " soclib::caba::VciSignals<vci_param> signal_mwmr"+HWAccelerator.getNo()+"_initiator(\"signal_mwmr"+HWAccelerator.getNo()+"_initiator\"" +CR; + +//signal = signal + " soclib::caba::FifoSignals<uint32_t> signal_fifo_to_ctrl"+HWAccelerator.getNo()+"(\"signal_fifo_to_ctrl"+HWAccelerator.getNo()+"\");"+CR; + //signal = signal + " soclib::caba::FifoSignals<uint32_t> signal_fifo_from_ctrl"+HWAccelerator.getNo()+"(\"signal_fifo_from_ctrl"+HWAccelerator.getNo()+"\");"+CR; + + +signal = signal + " soclib::caba::VciSignals<vci_param> signal_mwmr"+p+"_target(\"signal_mwmr"+p+"_target\""+CR; +signal = signal + " soclib::caba::VciSignals<vci_param> signal_mwmr"+p+"_initiator(\"signal_mwmr"+p+"_initiator\"" +CR; + +signal = signal + " soclib::caba::FifoSignals<uint32_t> signal_fifo_to_ctrl"+p+"(\"signal_fifo_to_ctrl"+p+"\");"+CR; + signal = signal + " soclib::caba::FifoSignals<uint32_t> signal_fifo_from_ctrl"+p+"(\"signal_fifo_from_ctrl"+p+"\");"+CR; + p++; +} + + signal = signal + " sc_core::sc_signal<bool> signal_xicu_irq[xicu_n_irq];" + CR2; //System.out.print("number of processors : " + TopCellGenerator.avatardd.getNbCPU()+"\n"); System.out.print("number of clusters : " + TopCellGenerator.avatardd.getNbClusters()+"\n"); diff --git a/src/main/java/dseengine/DSEConfiguration.java b/src/main/java/dseengine/DSEConfiguration.java index dab16ba7eb69356cfba5395db6e73bba5288e043..045662e0b184fd282e4723183d2619ac2cb5775e 100755 --- a/src/main/java/dseengine/DSEConfiguration.java +++ b/src/main/java/dseengine/DSEConfiguration.java @@ -1392,10 +1392,10 @@ public class DSEConfiguration implements Runnable { TMLArchiPanel newArch = drawMapping(tmla, "securedMapping"+(cpt-1)); GTMLModeling gtml =new GTMLModeling(newArch, true); tmla = gtml.translateToTMLMapping(); - tmla.tmlap = tmlap; - tmlcdp = (TMLComponentDesignPanel) mainGUI.tabs.get(0); - tmla.setTMLDesignPanel(tmlcdp); - System.out.println("tmlcdp " + tmlcdp); +// tmla.tmlap = tmlap; + // tmlcdp = (TMLComponentDesignPanel) mainGUI.tabs.get(0); + // tmla.setTMLDesignPanel(tmlcdp); + // System.out.println("tmlcdp " + tmlcdp); // //Repeat for secured mapping TMLMapping<TGComponent> secMapping = mainGUI.gtm.autoSecure(mainGUI, "mapping" +(cpt-1),tmla, newArch, encComp, overhead, decComp,true,false,false); diff --git a/src/main/java/tmltranslator/TMLActivity.java b/src/main/java/tmltranslator/TMLActivity.java index 19228fb812314dad1e3e3ec610fa21c62cf4acfc..e1fa1378e72668a0417a43339089d70b198d473d 100755 --- a/src/main/java/tmltranslator/TMLActivity.java +++ b/src/main/java/tmltranslator/TMLActivity.java @@ -155,6 +155,13 @@ public class TMLActivity extends TMLElement { return null; } + public void replaceElement(TMLActivityElement _oldE, TMLActivityElement _newE) { + _newE.setNexts(_oldE.getNexts()); + replaceAllNext(_oldE, _newE); + elements.add(_newE); + elements.remove(_oldE); + } + public void removeAllRandomSequences(TMLTask _task) { int idRandomSequence = 0; TMLRandomSequence tmlrs = findTMLRandomSequence(); diff --git a/src/main/java/tmltranslator/TMLActivityElementChannel.java b/src/main/java/tmltranslator/TMLActivityElementChannel.java index d9bc2be18d7620f670c4b93c92efe35fc9fafe8c..e7a93f9bbc2f3d37e831bf91a619d6efbd48a1db 100755 --- a/src/main/java/tmltranslator/TMLActivityElementChannel.java +++ b/src/main/java/tmltranslator/TMLActivityElementChannel.java @@ -53,10 +53,12 @@ import java.util.ArrayList; public class TMLActivityElementChannel extends TMLActivityElement { protected ArrayList<TMLChannel> channels; protected String nbOfSamples; + private boolean isAttacker; public TMLActivityElementChannel(String _name, Object _referenceObject) { super(_name, _referenceObject); channels = new ArrayList<TMLChannel>(); + isAttacker=false; } public void addChannel(TMLChannel _channel) { @@ -71,6 +73,14 @@ public class TMLActivityElementChannel extends TMLActivityElement { return channels.get(_index); } + public boolean isAttacker(){ + return isAttacker; + } + + public void setAttacker(boolean attacker){ + isAttacker=attacker; + } + public void setNbOfSamples(String _nbOfSamples) { nbOfSamples = _nbOfSamples; } diff --git a/src/main/java/tmltranslator/TMLChannel.java b/src/main/java/tmltranslator/TMLChannel.java index f813e8286896ff67a750a5ab0007b856166263cb..25f6c86a405a8c4071a75f58f8c2562b310a8c68 100755 --- a/src/main/java/tmltranslator/TMLChannel.java +++ b/src/main/java/tmltranslator/TMLChannel.java @@ -320,6 +320,25 @@ public class TMLChannel extends TMLCommunicationElement { return destinationTask; } + public TMLTask getSystemOriginTask() { + for (TMLTask task: originTasks){ + if (!task.isAttacker()){ + return task; + } + } + return originTask; + } + + public TMLTask getSystemDestinationTask() { + for (TMLTask task: destinationTasks){ + if (!task.isAttacker()){ + return task; + } + } + return destinationTask; + } + + public TMLPort getOriginPort() { return originPort; } diff --git a/src/main/java/tmltranslator/TMLMapping.java b/src/main/java/tmltranslator/TMLMapping.java index 6577db688eefa58b072d452c5e9b2e66a58b109b..db47137686b5d4ea3abb3e6c2872219955853eb8 100755 --- a/src/main/java/tmltranslator/TMLMapping.java +++ b/src/main/java/tmltranslator/TMLMapping.java @@ -47,7 +47,7 @@ import myutil.*; import tmltranslator.toproverif.TML2ProVerif; import ui.TMLArchiPanel; import ui.TMLComponentDesignPanel; -import ui.util.CorrespondanceElement; +import ui.CorrespondanceTGElement; import java.util.*; @@ -71,7 +71,7 @@ public class TMLMapping<E> { private List<HwCommunicationNode> oncommnodes; private List<TMLElement> mappedcommelts; - public CorrespondanceElement<E> listE; + private CorrespondanceTGElement listE; // Security public boolean firewall = false; @@ -90,9 +90,9 @@ public class TMLMapping<E> { - // REFERENCES TO BE REMOVED!!!! - private TMLComponentDesignPanel tmldp; - public TMLArchiPanel tmlap; + // REFERENCES TO BE REMOVED!!!! :( + //private TMLComponentDesignPanel tmldp; + //public TMLArchiPanel tmlap; public TMLMapping(TMLModeling<E> _tmlm, TMLArchitecture _tmla, boolean reset) { @@ -149,6 +149,15 @@ public class TMLMapping<E> { return null; } + public CorrespondanceTGElement getCorrespondanceList(){ + return listE; + } + + public void setCorrespondanceList(CorrespondanceTGElement cl){ + listE=cl; + } + + public void addCustomValue(String custom) { customValues.add(custom); } @@ -1492,14 +1501,95 @@ public class TMLMapping<E> { } } - public void setTMLDesignPanel(TMLComponentDesignPanel _tmldp){ - tmldp = _tmldp; + public boolean channelAllowed(TMLChannel chan){ + TMLTask orig = chan.getOriginTask(); + TMLTask dest = chan.getDestinationTask(); + List<HwNode> path = getPath(orig, dest); + for (HwNode node:path){ + if (node instanceof HwBridge){ + for (String rule:((HwBridge) node).firewallRules){ + String t1 = rule.split("->")[0]; + String t2 = rule.split("->")[1]; + if (t1.equals(orig.getName().replaceAll("__","::")) || t1.equals("*")){ + if (t2.equals(dest.getName().replaceAll("__","::")) || t2.equals("*")){ + return false; + } + } + } + } + } + return true; + } + + + public List<HwNode> getPath(TMLTask t1, TMLTask t2){ + HwNode node1 = getHwNodeOf(t1); + HwNode node2 = getHwNodeOf(t2); + List<HwNode> path = new ArrayList<HwNode>(); + if (node1==node2){ + return path; + } + if (node1!=node2){ + //Navigate architecture for node + List<HwLink> links = getTMLArchitecture().getHwLinks(); + // HwNode last = node1; + List<HwNode> found = new ArrayList<HwNode>(); + List<HwNode> done = new ArrayList<HwNode>(); + Map<HwNode, List<HwNode>> pathMap = new HashMap<HwNode, List<HwNode>>(); + for (HwLink link: links){ + if (link.hwnode == node1){ + found.add(link.bus); + List<HwNode> tmp = new ArrayList<HwNode>(); + tmp.add(link.bus); + pathMap.put(link.bus, tmp); + } + } + outerloop: + while (found.size()>0){ + HwNode curr = found.remove(0); + for (HwLink link: links){ + if (curr == link.bus){ + if (link.hwnode == node2){ + path = pathMap.get(curr); + break outerloop; + } + if (!done.contains(link.hwnode) && !found.contains(link.hwnode) && link.hwnode instanceof HwBridge){ + found.add(link.hwnode); + List<HwNode> tmp = new ArrayList<HwNode>(pathMap.get(curr)); + tmp.add(link.hwnode); + pathMap.put(link.hwnode, tmp); + } + } + else if (curr == link.hwnode){ + if (!done.contains(link.bus) && !found.contains(link.bus)){ + found.add(link.bus); + List<HwNode> tmp = new ArrayList<HwNode>(pathMap.get(curr)); + tmp.add(link.bus); + pathMap.put(link.bus, tmp); + } + } + } + done.add(curr); + } + } + return path; } - public TMLComponentDesignPanel getTMLCDesignPanel(){ - return tmldp; - } + public boolean isAttackerAccessible(TMLChannel chan){ + TMLTask orig = chan.getSystemOriginTask(); + TMLTask dest = chan.getSystemDestinationTask(); + List<HwNode> path = getPath(orig, dest); + for (HwNode node:path){ + if (node instanceof HwBus){ + HwBus bus = (HwBus) node; + if (bus.privacy==HwCommunicationNode.BUS_PUBLIC){ + return true; + } + } + } + return false; + } public String toXML() { String s = "<TMLMAPPING>\n"; diff --git a/src/main/java/tmltranslator/TMLModeling.java b/src/main/java/tmltranslator/TMLModeling.java index 9307d14f8d3fc05d39d50ec65f481dc9d312f4e3..26fb4ed6695db61e5a773452e6225998acd7ba26 100755 --- a/src/main/java/tmltranslator/TMLModeling.java +++ b/src/main/java/tmltranslator/TMLModeling.java @@ -52,6 +52,7 @@ import proverifspec.ProVerifQueryResult; import ui.TAttribute; import ui.tmlcompd.TMLCPrimitiveComponent; import ui.tmlcompd.TMLCPrimitivePort; +import ui.TGComponent; import java.util.*; @@ -682,6 +683,17 @@ public class TMLModeling<E> { public List<TMLTask> getTasks() { return tasks; } + + public List<TMLTask> getAttackerTasks(){ + List<TMLTask> attackers = new ArrayList<TMLTask>(); + for (TMLTask task: tasks){ + if (task.isAttacker()){ + attackers.add(task); + } + } + return attackers; + } + public List<String[]> getPragmas(){ return pragmas; } @@ -812,6 +824,10 @@ public class TMLModeling<E> { } } } + public TGComponent getTGComponent(){ + return (TGComponent) getTasks().get(0).getReferenceObject(); + } + public void backtraceAuthenticity(HashMap<AvatarPragmaAuthenticity, ProVerifQueryAuthResult> authenticityResults, String mappingName) { // System.out.println("Backtracing Authenticity"); diff --git a/src/main/java/tmltranslator/toavatar/TML2Avatar.java b/src/main/java/tmltranslator/toavatar/TML2Avatar.java index 0e54f143d2a9ba1117da7cb033151cd1ef6a976d..0653a1a880a9843fe4cc5e1b15b257af3b98a04f 100644 --- a/src/main/java/tmltranslator/toavatar/TML2Avatar.java +++ b/src/main/java/tmltranslator/toavatar/TML2Avatar.java @@ -1360,12 +1360,8 @@ public class TML2Avatar { //TODO: Make state names readable //TODO: Put back numeric guards //TODO: Calcuate for temp variable + this.avspec = new AvatarSpecification("spec", tmlmap.getTMLModeling().getTGComponent().getTDiagramPanel().tp); - this.avspec = new AvatarSpecification("spec", tmlmap.getTMLCDesignPanel()); - if (tmlmap.getTMLCDesignPanel()==null){ - //System.out.println("Failed to generate specification"); - // return avspec; - } attrsToCheck.clear(); //tmlmodel.removeForksAndJoins(); //Only set the loop limit if it's a number diff --git a/src/main/java/ui/AvatarDeploymentPanelTranslator.java b/src/main/java/ui/AvatarDeploymentPanelTranslator.java index 1e76d0760a10e0085eb7c7a27e79810b06d142f7..30fec965222a15704b8a7df791e127c3ac471e54 100644 --- a/src/main/java/ui/AvatarDeploymentPanelTranslator.java +++ b/src/main/java/ui/AvatarDeploymentPanelTranslator.java @@ -242,10 +242,12 @@ public class AvatarDeploymentPanelTranslator { int nConfig = addCoproMWMRNode.getNConfig(); // Nb of configuration registers int nStatus = addCoproMWMRNode.getNStatus(); // nb of status registers boolean useLLSC = addCoproMWMRNode.getUseLLSC(); // more efficient protocol. 0: not used. 1 or more -> used - + nb_init++; + nb_target+=2;//DG 28.08. two targets as two segments of memory are created mwmr and mwmrd AvatarCoproMWMR acpMWMR; acpMWMR = new AvatarCoproMWMR(timerName, srcid, srcid, tgtid, plaps, fifoToCoprocDepth, fifoFromCoprocDepth, nToCopro, nFromCopro, nConfig, nStatus, useLLSC); avatarMap.put(dp, acpMWMR); + avatarComponents.add(acpMWMR); } else if (dp instanceof ADDMemoryNode) { @@ -255,7 +257,7 @@ public class AvatarDeploymentPanelTranslator { String name = addRamNode.getNodeName(); int index = addRamNode.getIndex(); int byteDataSize = addRamNode.getDataSize(); - + System.out.println("ADD RAM Data Size" + byteDataSize); //int monitored = addRamNode.getMonitored(); System.out.println("ADD RAM monitored "+ addRamNode.getMonitored()); AvatarRAM avram = new AvatarRAM(name, index, byteDataSize, index, index, addRamNode.getMonitored());//DG 3.7. diff --git a/src/main/java/ui/GTMLModeling.java b/src/main/java/ui/GTMLModeling.java index 94cd22a6387f7d7b54436bc0d902904097eb8b05..2962737ca1255d9ea30782dd5279cb99ef6c4d96 100755 --- a/src/main/java/ui/GTMLModeling.java +++ b/src/main/java/ui/GTMLModeling.java @@ -63,6 +63,7 @@ import ui.tmlcd.TMLTaskOperator; import ui.tmlcompd.TMLCPath; import ui.tmlcompd.TMLCPrimitiveComponent; import ui.tmlcompd.TMLCPrimitivePort; +import ui.tmlcompd.*; import ui.tmlcompd.TMLCRecordComponent; import ui.tmldd.*; import ui.tmlsd.TGConnectorMessageTMLSD; @@ -71,7 +72,7 @@ import ui.tmlsd.TMLSDStorageInstance; import ui.tmlsd.TMLSDTransferInstance; import java.util.*; - +import java.awt.Point; /** * Class GTMLModeling @@ -153,6 +154,124 @@ public class GTMLModeling { putPrefixName = _b; } + public void processAttacker(){ + //System.out.println("processing..."); + //System.out.println(tmlm.getAttackerTasks()); + if (tmlm==null){ + return; + } + List<TMLTask> attackers = tmlm.getAttackerTasks(); + for (TMLTask attacker: attackers){ + //System.out.println(attacker.getName()); + TMLCPrimitiveComponent atcomp = tmlcdp.getPrimitiveComponentByName(attacker.getName().split("__")[1]); + //System.out.println("comp " + attacker.getName().split("__")[1]); + if (atcomp !=null){ + //Find activity diagram + TMLActivityDiagramPanel tadp = tmlcdp.getTMLActivityDiagramPanel(attacker.getName().split("__")[1]); + List<TGComponent> list = tadp.getComponentList(); + //System.out.println("list " + list); + for (TGComponent tgc: list){ + if (tgc instanceof TMLADWriteChannel){ + TMLADWriteChannel wr = (TMLADWriteChannel) tgc; + if (wr.isAttacker()){ + //System.out.println("channel " + wr.getChannelName()); + String channelToAdd = wr.getChannelName(); + + + //Find ports to attach + List<TMLCPrimitivePort> ports = tmlcdp.tmlctdp.getPortsByName(channelToAdd); + //System.out.println("orts " + ports); + if (ports.size()!=2){ + //throw error + //System.out.println("ERROR"); + continue; + } + + //Remove Port Connector + tmlcdp.tmlctdp.removeOneConnector(ports.get(0).getTGConnectingPointAtIndex(0)); + + + //Add write port to attacker component + TMLCChannelOutPort originPort = new TMLCChannelOutPort(atcomp.getX(), atcomp.getY(), tmlcdp.tmlctdp.getMinX(), tmlcdp.tmlctdp.getMaxX(), tmlcdp.tmlctdp.getMinY(), tmlcdp.tmlctdp.getMaxX(), true, atcomp, tmlcdp.tmlctdp); + originPort.commName=channelToAdd; + tmlcdp.tmlctdp.addComponent(originPort, atcomp.getX(), atcomp.getY(),true,true); + + //Add fork/join to Component Diagram + TMLCJoin join = new TMLCJoin(atcomp.getX(), atcomp.getY(), tmlcdp.tmlctdp.getMinX(), tmlcdp.tmlctdp.getMaxX(), tmlcdp.tmlctdp.getMinY(), tmlcdp.tmlctdp.getMaxX(), true, null, tmlcdp.tmlctdp); + tmlcdp.tmlctdp.addComponent(join, atcomp.getX(), atcomp.getY(),false,true); + + //Add 3 connectors, from each port to the join + TMLCPortConnector conn = new TMLCPortConnector(0, 0, tmlcdp.tmlctdp.getMinX(), tmlcdp.tmlctdp.getMaxX(), tmlcdp.tmlctdp.getMinY(), tmlcdp.tmlctdp.getMaxX(), true, null, tmlcdp.tmlctdp, originPort.getTGConnectingPointAtIndex(0), join.getTGConnectingPointAtIndex(1), new Vector<Point>()); + tmlcdp.tmlctdp.addComponent(conn, 0,0,false,true); + if (!ports.get(0).isOrigin()){ + conn = new TMLCPortConnector(0, 0, tmlcdp.tmlctdp.getMinX(), tmlcdp.tmlctdp.getMaxX(), tmlcdp.tmlctdp.getMinY(), tmlcdp.tmlctdp.getMaxX(), true, null, tmlcdp.tmlctdp, ports.get(0).getTGConnectingPointAtIndex(0), join.getTGConnectingPointAtIndex(0), new Vector<Point>()); + tmlcdp.tmlctdp.addComponent(conn, 0,0,false,true); + conn = new TMLCPortConnector(0, 0, tmlcdp.tmlctdp.getMinX(), tmlcdp.tmlctdp.getMaxX(), tmlcdp.tmlctdp.getMinY(), tmlcdp.tmlctdp.getMaxX(), true, null, tmlcdp.tmlctdp, ports.get(1).getTGConnectingPointAtIndex(0), join.getTGConnectingPointAtIndex(6), new Vector<Point>()); + tmlcdp.tmlctdp.addComponent(conn, 0,0,false,true); + } + else { + conn = new TMLCPortConnector(0, 0, tmlcdp.tmlctdp.getMinX(), tmlcdp.tmlctdp.getMaxX(), tmlcdp.tmlctdp.getMinY(), tmlcdp.tmlctdp.getMaxX(), true, null, tmlcdp.tmlctdp, ports.get(0).getTGConnectingPointAtIndex(0), join.getTGConnectingPointAtIndex(6), new Vector<Point>()); + tmlcdp.tmlctdp.addComponent(conn, 0,0,false,true); + conn = new TMLCPortConnector(0, 0, tmlcdp.tmlctdp.getMinX(), tmlcdp.tmlctdp.getMaxX(), tmlcdp.tmlctdp.getMinY(), tmlcdp.tmlctdp.getMaxX(), true, null, tmlcdp.tmlctdp, ports.get(1).getTGConnectingPointAtIndex(0), join.getTGConnectingPointAtIndex(0), new Vector<Point>()); + tmlcdp.tmlctdp.addComponent(conn, 0,0,false,true); + } + + } + } + else if (tgc instanceof TMLADReadChannel){ + TMLADReadChannel rd = (TMLADReadChannel) tgc; + if (rd.isAttacker()){ + //System.out.println("channel " + rd.getChannelName()); + String channelToAdd = rd.getChannelName(); + + + //Find ports to attach + List<TMLCPrimitivePort> ports = tmlcdp.tmlctdp.getPortsByName(channelToAdd); + //System.out.println("orts " + ports); + if (ports.size()!=2){ + //throw error + //System.out.println("ERROR"); + continue; + } + + //Remove Port Connector + tmlcdp.tmlctdp.removeOneConnector(ports.get(0).getTGConnectingPointAtIndex(0)); + + + //Add write port to attacker component + TMLCChannelOutPort destPort = new TMLCChannelOutPort(atcomp.getX(), atcomp.getY(), tmlcdp.tmlctdp.getMinX(), tmlcdp.tmlctdp.getMaxX(), tmlcdp.tmlctdp.getMinY(), tmlcdp.tmlctdp.getMaxX(), true, atcomp, tmlcdp.tmlctdp); + destPort.commName=channelToAdd; + destPort.isOrigin=false; + tmlcdp.tmlctdp.addComponent(destPort, atcomp.getX(), atcomp.getY(),true,true); + + //Add fork/join to Component Diagram + TMLCFork fork = new TMLCFork(atcomp.getX(), atcomp.getY(), tmlcdp.tmlctdp.getMinX(), tmlcdp.tmlctdp.getMaxX(), tmlcdp.tmlctdp.getMinY(), tmlcdp.tmlctdp.getMaxX(), true, null, tmlcdp.tmlctdp); + tmlcdp.tmlctdp.addComponent(fork, atcomp.getX(), atcomp.getY(),false,true); + + //Add 3 connectors, from each port to the join + TMLCPortConnector conn = new TMLCPortConnector(0, 0, tmlcdp.tmlctdp.getMinX(), tmlcdp.tmlctdp.getMaxX(), tmlcdp.tmlctdp.getMinY(), tmlcdp.tmlctdp.getMaxX(), true, null, tmlcdp.tmlctdp, destPort.getTGConnectingPointAtIndex(0), fork.getTGConnectingPointAtIndex(1), new Vector<Point>()); + tmlcdp.tmlctdp.addComponent(conn, 0,0,false,true); + if (ports.get(0).isOrigin()){ + conn = new TMLCPortConnector(0, 0, tmlcdp.tmlctdp.getMinX(), tmlcdp.tmlctdp.getMaxX(), tmlcdp.tmlctdp.getMinY(), tmlcdp.tmlctdp.getMaxX(), true, null, tmlcdp.tmlctdp, ports.get(0).getTGConnectingPointAtIndex(0), fork.getTGConnectingPointAtIndex(0), new Vector<Point>()); + tmlcdp.tmlctdp.addComponent(conn, 0,0,false,true); + conn = new TMLCPortConnector(0, 0, tmlcdp.tmlctdp.getMinX(), tmlcdp.tmlctdp.getMaxX(), tmlcdp.tmlctdp.getMinY(), tmlcdp.tmlctdp.getMaxX(), true, null, tmlcdp.tmlctdp, ports.get(1).getTGConnectingPointAtIndex(0), fork.getTGConnectingPointAtIndex(6), new Vector<Point>()); + tmlcdp.tmlctdp.addComponent(conn, 0,0,false,true); + } + else { + conn = new TMLCPortConnector(0, 0, tmlcdp.tmlctdp.getMinX(), tmlcdp.tmlctdp.getMaxX(), tmlcdp.tmlctdp.getMinY(), tmlcdp.tmlctdp.getMaxX(), true, null, tmlcdp.tmlctdp, ports.get(0).getTGConnectingPointAtIndex(0), fork.getTGConnectingPointAtIndex(6), new Vector<Point>()); + tmlcdp.tmlctdp.addComponent(conn, 0,0,false,true); + conn = new TMLCPortConnector(0, 0, tmlcdp.tmlctdp.getMinX(), tmlcdp.tmlctdp.getMaxX(), tmlcdp.tmlctdp.getMinY(), tmlcdp.tmlctdp.getMaxX(), true, null, tmlcdp.tmlctdp, ports.get(1).getTGConnectingPointAtIndex(0), fork.getTGConnectingPointAtIndex(0), new Vector<Point>()); + tmlcdp.tmlctdp.addComponent(conn, 0,0,false,true); + } + + } + } + } + } + } + + } + public TMLModeling<TGComponent> translateToTMLModeling(boolean onlyTakenIntoAccount, boolean _resetID) { tmlm = new TMLModeling<>(_resetID); checkingErrors = new LinkedList<CheckingError> (); @@ -253,6 +372,9 @@ public class GTMLModeling { } addTMLComponents(); + //Adapt for attacker + TraceManager.addDev("Processing attacker"); + processAttacker(); TraceManager.addDev("Adding channels"); addTMLCChannels(); TraceManager.addDev("Adding events"); @@ -1818,9 +1940,12 @@ public class GTMLModeling { listE.addCor(tmlrsequence, tgc); } else if (tgc instanceof TMLADReadChannel) { - if (!tmltask.isAttacker()){ // Get the channel + TMLADReadChannel rd = (TMLADReadChannel) tgc; channel = tmlm.getChannelByName(getFromTable(tmltask, ((TMLADReadChannel)tgc).getChannelName())); + /*if (rd.isAttacker()){ + channel = tmlm.getChannelByName(getAttackerChannel(((TMLADReadChannel)tgc).getChannelName())); + }*/ if (channel == null) { if (Conversion.containsStringInList(removedChannels, ((TMLADReadChannel)tgc).getChannelName())) { UICheckingError ce = new UICheckingError(CheckingError.BEHAVIOR_ERROR, "A call to " + ((TMLADReadChannel)tgc).getChannelName() + " has been removed because the corresponding channel is not taken into account"); @@ -1836,13 +1961,14 @@ public class GTMLModeling { ((BasicErrorHighlight)tgc).setStateAction(ErrorHighlight.UNKNOWN); checkingErrors.add(ce); } + } else { tmlreadchannel = new TMLReadChannel("read channel", tgc); tmlreadchannel.setNbOfSamples(modifyString(((TMLADReadChannel)tgc).getSamplesValue())); tmlreadchannel.addChannel(channel); //security pattern - if (securityPatterns.get(((TMLADReadChannel)tgc).securityContext)!=null){ - tmlreadchannel.securityPattern= securityPatterns.get(((TMLADReadChannel)tgc).securityContext); + if (securityPatterns.get(((TMLADReadChannel)tgc).getSecurityContext())!=null){ + tmlreadchannel.securityPattern= securityPatterns.get(((TMLADReadChannel)tgc).getSecurityContext()); //NbOfSamples will increase due to extra overhead from MAC int cur=1; try { @@ -1860,24 +1986,19 @@ public class GTMLModeling { cur = cur+ add; tmlreadchannel.setNbOfSamples(Integer.toString(cur)); } - else if (!((TMLADReadChannel)tgc).securityContext.isEmpty()){ + else if (!((TMLADReadChannel)tgc).getSecurityContext().isEmpty()){ //Throw error for missing security pattern - UICheckingError ce = new UICheckingError(CheckingError.STRUCTURE_ERROR, "Security Pattern " + ((TMLADReadChannel)tgc).securityContext + " not found"); + UICheckingError ce = new UICheckingError(CheckingError.STRUCTURE_ERROR, "Security Pattern " + ((TMLADReadChannel)tgc).getSecurityContext() + " not found"); ce.setTDiagramPanel(tadp); ce.setTGComponent(tgc); checkingErrors.add(ce); } + if (tmltask.isAttacker()){ + tmlreadchannel.setAttacker(true); + } activity.addElement(tmlreadchannel); ((BasicErrorHighlight)tgc).setStateAction(ErrorHighlight.OK); listE.addCor(tmlreadchannel, tgc); - } - } else { - tmlexecc = new TMLExecC("execc", tgc); - tmlexecc.setValue("100"); - tmlexecc.setAction("100"); - activity.addElement(tmlexecc); - ((BasicErrorHighlight)tgc).setStateAction(ErrorHighlight.OK); - listE.addCor(tmlexecc, tgc); } } else if (tgc instanceof TMLADSendEvent) { event = tmlm.getEventByName(getFromTable(tmltask, ((TMLADSendEvent)tgc).getEventName())); @@ -2127,7 +2248,7 @@ public class GTMLModeling { } else if (tgc instanceof TMLADWriteChannel) { // Get channels - if (!tmltask.isAttacker()){ + TMLADWriteChannel wr = (TMLADWriteChannel) tgc; channels = ((TMLADWriteChannel)tgc).getChannelsByName(); boolean error = false; for(int i=0; i<channels.length; i++) { @@ -2149,7 +2270,8 @@ public class GTMLModeling { checkingErrors.add(ce); } error = true; - } + + } } if (!error) { tmlwritechannel = new TMLWriteChannel("write channel", tgc); @@ -2158,9 +2280,13 @@ public class GTMLModeling { channel = tmlm.getChannelByName(getFromTable(tmltask, channels[i])); tmlwritechannel.addChannel(channel); } + //if (wr.isAttacker()){ + //channel = tmlm.getChannelByName(getAttackerChannel(channels[0])); + //tmlwritechannel.addChannel(channel); + //} //add sec pattern - if (securityPatterns.get(((TMLADWriteChannel)tgc).securityContext)!=null){ - tmlwritechannel.securityPattern= securityPatterns.get(((TMLADWriteChannel)tgc).securityContext); + if (securityPatterns.get(((TMLADWriteChannel)tgc).getSecurityContext())!=null){ + tmlwritechannel.securityPattern= securityPatterns.get(((TMLADWriteChannel)tgc).getSecurityContext()); int cur = Integer.valueOf(modifyString(((TMLADWriteChannel)tgc).getSamplesValue())); int add = Integer.valueOf(tmlwritechannel.securityPattern.overhead); if (!tmlwritechannel.securityPattern.nonce.equals("")){ @@ -2172,30 +2298,21 @@ public class GTMLModeling { cur = cur+ add; tmlwritechannel.setNbOfSamples(Integer.toString(cur)); } - else if (!((TMLADWriteChannel)tgc).securityContext.isEmpty()){ + else if (!((TMLADWriteChannel)tgc).getSecurityContext().isEmpty()){ //Throw error for missing security pattern - UICheckingError ce = new UICheckingError(CheckingError.STRUCTURE_ERROR, "Security Pattern " + ((TMLADWriteChannel)tgc).securityContext + " not found"); + UICheckingError ce = new UICheckingError(CheckingError.STRUCTURE_ERROR, "Security Pattern " + ((TMLADWriteChannel)tgc).getSecurityContext() + " not found"); ce.setTDiagramPanel(tadp); ce.setTGComponent(tgc); checkingErrors.add(ce); } + if (tmltask.isAttacker()){ + tmlwritechannel.setAttacker(true); + } activity.addElement(tmlwritechannel); ((BasicErrorHighlight)tgc).setStateAction(ErrorHighlight.OK); listE.addCor(tmlwritechannel, tgc); } - } else { - System.out.println("removing write channel"); - tmlexecc = new TMLExecC("execc", tgc); - tmlexecc.setValue("100"); - tmlexecc.setAction("100"); - activity.addElement(tmlexecc); - ((BasicErrorHighlight)tgc).setStateAction(ErrorHighlight.OK); - listE.addCor(tmlexecc, tgc); - } - } - - - + } } // Interconnection between elements @@ -2369,7 +2486,6 @@ public class GTMLModeling { tmlm = new TMLModeling<>(true); archi = new TMLArchitecture(); //filled by makeArchitecture map = new TMLMapping<>(tmlm, archi, false); - map.tmlap = tmlap; checkingErrors = new LinkedList<CheckingError> (); warnings = new LinkedList<CheckingError> (); //listE = new CorrespondanceTGElement(); @@ -2382,7 +2498,8 @@ public class GTMLModeling { } //TraceManager.addDev("Making mapping"); makeMapping(); //fills map - map.listE = listE; + processAttackerScenario(); + map.setCorrespondanceList(listE); // map.securityPatterns.addAll(securityPatterns.keySet()); //TraceManager.addDev("Making TMLCPLib"); makeTMLCPLib(); @@ -2395,13 +2512,41 @@ public class GTMLModeling { } autoMapKeys();*/ removeActionsWithRecords(); - map.setTMLDesignPanel(this.tmlcdp); if (map.firewall){ tmlap.getMainGUI().gtm.drawFirewall(map); } return map; // the data structure map is returned to CheckSyntaxTMLMapping in GTURTLEModeling } + public void processAttackerScenario(){ + //Scan tasks and activity diagrams for attacker read/write channels + for (TMLTask task: tmlm.getTasks()){ + if (task.isAttacker()){ + TMLActivity act=task.getActivityDiagram(); + List<TMLActivityElement> toRemove= new ArrayList<TMLActivityElement>(); + for (TMLActivityElement elem: act.getElements()){ + if (elem instanceof TMLActivityElementChannel){ + TMLActivityElementChannel elemChannel = (TMLActivityElementChannel) elem; + if (elemChannel.isAttacker()){ + TMLChannel chan = elemChannel.getChannel(0); + if (!map.isAttackerAccessible(chan)){ + toRemove.add(elem); + //Remove read/writechannel + } + } + } + } + for (TMLActivityElement elem: toRemove){ + TMLExecI exec= new TMLExecI("100",elem.getReferenceObject()); + exec.setAction("100"); + exec.setValue("100"); + act.replaceElement(elem, exec); + } + //System.out.println("activity " + act.toXML()); + } + } + + } public TMLCP translateToTMLCPDataStructure( String _cpName ) { @@ -3595,6 +3740,15 @@ public class GTMLModeling { table.put(s1, s2); } + public String getAttackerChannel(String s){ + for (String channelName: table.keySet()){ + if (channelName.split("/")[1].equals(s)){ + return table.get(channelName); + } + } + return ""; + } + public String getFromTable(TMLTask task, String s) { //TraceManager.addDev("TABLE GET: Getting from task=" + task.getName() + " element=" + s); diff --git a/src/main/java/ui/GTURTLEModeling.java b/src/main/java/ui/GTURTLEModeling.java index ce9792f900900919cec52a788793999e6ce319bf..02140d94dd873c250f5ae58ddaf4b76e0e77f763 100755 --- a/src/main/java/ui/GTURTLEModeling.java +++ b/src/main/java/ui/GTURTLEModeling.java @@ -734,13 +734,18 @@ public class GTURTLEModeling { } public TMLMapping<TGComponent> drawFirewall(TMLMapping<TGComponent> map){ System.out.println("DRAWING FIREWALL"); - TMLComponentDesignPanel tmlcdp = map.getTMLCDesignPanel(); + TGComponent comp= map.getTMLModeling().getTGComponent(); + TMLComponentDesignPanel tmlcdp = (TMLComponentDesignPanel) comp.getTDiagramPanel().tp; + // TMLComponentDesignPanel tmlcdp = map.getTMLCDesignPanel(); TMLModeling<TGComponent> tmlm = map.getTMLModeling(); + TMLArchitecture archi = map.getArch(); + TURTLEPanel tmlap = map.getCorrespondanceList().getTG(archi.getFirstCPU()).getTDiagramPanel().tp; TMLActivityDiagramPanel firewallADP = null; TMLComponentTaskDiagramPanel tcdp = tmlcdp.tmlctdp; if (TraceManager.devPolicy == TraceManager.TO_CONSOLE){ MainGUI gui = tmlcdp.getMainGUI(); - int arch = mgui.tabs.indexOf(map.tmlap); + + int arch = mgui.tabs.indexOf(tmlap); gui.cloneRenameTab(arch,"firewallArch"); TMLArchiPanel newarch = (TMLArchiPanel) gui.tabs.get(gui.tabs.size()-1); int ind = gui.tabs.indexOf(tmlcdp); @@ -813,8 +818,8 @@ public class GTURTLEModeling { outChans.put(chan,rd); toAdd.add(rd); toAdd.add(wr); - map.listE.addCor(rd, (TGComponent) rd.getReferenceObject()); - map.listE.addCor(wr, (TGComponent) wr.getReferenceObject()); + map.getCorrespondanceList().addCor(rd, (TGComponent) rd.getReferenceObject()); + map.getCorrespondanceList().addCor(wr, (TGComponent) wr.getReferenceObject()); } tmlm.removeAllChannels(); for (TMLChannel c:toAdd){ @@ -930,7 +935,7 @@ public class GTURTLEModeling { TMLStartState start = new TMLStartState("start", adStart); act.setFirst(start); - map.listE.addCor(start,adStart); + map.getCorrespondanceList().addCor(start,adStart); //Add infinite loop @@ -946,7 +951,7 @@ public class GTURTLEModeling { TMLChoice choice = new TMLChoice("chooseChannel", adChoice); act.addElement(choice); loop.addNext(choice); - map.listE.addCor(choice,adChoice); + map.getCorrespondanceList().addCor(choice,adChoice); @@ -1000,7 +1005,7 @@ public class GTURTLEModeling { } //Redo all reference objects - map.listE.useDIPLOIDs(); + map.getCorrespondanceList().useDIPLOIDs(); return map; } @@ -1059,12 +1064,15 @@ public class GTURTLEModeling { return; } //Clone diagrams - - int arch = gui.tabs.indexOf(tmap.tmlap); + TURTLEPanel tmlap = tmap.getCorrespondanceList().getTG(tmap.getArch().getFirstCPU()).getTDiagramPanel().tp; + int arch = gui.tabs.indexOf(tmlap); gui.cloneRenameTab(arch,"hsm"); TMLArchiPanel newarch = (TMLArchiPanel) gui.tabs.get(gui.tabs.size()-1); - TMLComponentDesignPanel tmlcdp = tmap.getTMLCDesignPanel(); + TGComponent tgcomp= tmap.getTMLModeling().getTGComponent(); + TMLComponentDesignPanel tmlcdp= (TMLComponentDesignPanel) tgcomp.getTDiagramPanel().tp; + +// TMLComponentDesignPanel tmlcdp = tmap.getTMLCDesignPanel(); int ind = gui.tabs.indexOf(tmlcdp); String tabName = gui.getTitleAt(tmlcdp); gui.cloneRenameTab(ind, name); @@ -1137,7 +1145,7 @@ public class GTURTLEModeling { for (TGComponent tg: tad.getComponentList()){ if (tg instanceof TMLADWriteChannel){ TMLADWriteChannel writeChannel = (TMLADWriteChannel) tg; - if (writeChannel.securityContext.equals("")){ + if (writeChannel.getSecurityContext().equals("")){ String nonceName=""; int type=-1; if (nonSecChans.contains(compName+"__"+writeChannel.getChannelName()+"_chData")){ @@ -1165,7 +1173,7 @@ public class GTURTLEModeling { fromStart = tad.findTGConnectorEndingAt(tg.getTGConnectingPointAtIndex(0)); if (fromStart!=null){ channelInstances.add(tg); - SecurityPattern sp = tmap.getSecurityPatternByName(writeChannel.securityContext); + SecurityPattern sp = tmap.getSecurityPatternByName(writeChannel.getSecurityContext()); int type=-1; if (sp.type.equals("Symmetric Encryption")){ type=HSMChannel.SENC; @@ -1180,7 +1188,7 @@ public class GTURTLEModeling { type=HSMChannel.NONCE; } HSMChannel ch = new HSMChannel(writeChannel.getChannelName(), compName, type); - ch.securityContext=writeChannel.securityContext; + ch.securityContext=writeChannel.getSecurityContext(); compChannels.put(writeChannel.getChannelName(),ch); //chanNames.add(writeChannel.getChannelName()+compName); } @@ -1188,7 +1196,7 @@ public class GTURTLEModeling { } if (tg instanceof TMLADReadChannel){ TMLADReadChannel readChannel = (TMLADReadChannel) tg; - if (readChannel.securityContext.equals("")){ + if (readChannel.getSecurityContext().equals("")){ fromStart = tad.findTGConnectorEndingAt(tg.getTGConnectingPointAtIndex(0)); if (fromStart!=null){ if(nonSecChans.contains(compName+"__"+readChannel.getChannelName()+"_chData") || nonAuthChans.contains(compName+"__"+readChannel.getChannelName())){ @@ -1207,7 +1215,7 @@ public class GTURTLEModeling { if (fromStart!=null){ channelInstances.add(tg); HSMChannel ch = new HSMChannel(readChannel.getChannelName(), compName, HSMChannel.DEC); - ch.securityContext=readChannel.securityContext; + ch.securityContext=readChannel.getSecurityContext(); compChannels.put(readChannel.getChannelName(),ch); } } @@ -1279,7 +1287,7 @@ public class GTURTLEModeling { TMLADWriteChannel writeChannel = (TMLADWriteChannel) chan; chanName=writeChannel.getChannelName(); HSMChannel ch = hsmChannels.get(chanName); - writeChannel.securityContext = ch.securityContext; + writeChannel.setSecurityContext(ch.securityContext); xpos = chan.getX(); ypos = chan.getY(); fromStart = tad.findTGConnectorEndingAt(chan.getTGConnectingPointAtIndex(0)); @@ -1305,7 +1313,7 @@ public class GTURTLEModeling { //Add write channel operator wr = new TMLADWriteChannel(xpos, ypos+yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad); wr.setChannelName("data_"+chanName+"_"+compName); - wr.securityContext = ch.securityContext; + wr.setSecurityContext(ch.securityContext); tad.addComponent(wr, xpos, ypos+yShift, false,true); @@ -1327,7 +1335,7 @@ public class GTURTLEModeling { yShift+=60; TMLADReadChannel rd = new TMLADReadChannel(xpos, ypos+yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad); rd.setChannelName("retData_"+chanName+"_"+compName); - rd.securityContext = ch.securityContext; + rd.setSecurityContext(ch.securityContext); tad.addComponent(rd, xpos, ypos+yShift, false,true); fromStart.setP2(rd.getTGConnectingPointAtIndex(0)); @@ -1362,7 +1370,7 @@ public class GTURTLEModeling { TMLADReadChannel readChannel = (TMLADReadChannel) chan; chanName=readChannel.getChannelName(); HSMChannel ch= hsmChannels.get(chanName); - readChannel.securityContext = ch.securityContext; + readChannel.setSecurityContext(ch.securityContext); xpos = chan.getX()+10; ypos = chan.getY(); fromStart = tad.findTGConnectorStartingAt(chan.getTGConnectingPointAtIndex(1)); @@ -1404,7 +1412,7 @@ public class GTURTLEModeling { //Add write channel operator TMLADWriteChannel wr = new TMLADWriteChannel(xpos, ypos+yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad); wr.setChannelName("data_"+chanName+"_"+compName); - wr.securityContext = ch.securityContext; + wr.setSecurityContext(ch.securityContext); tad.addComponent(wr, xpos, ypos+yShift, false,true); @@ -1419,7 +1427,7 @@ public class GTURTLEModeling { yShift+=60; TMLADReadChannel rd = new TMLADReadChannel(xpos, ypos+yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad); rd.setChannelName("retData_"+chanName+"_"+compName); - rd.securityContext = ch.securityContext; + rd.setSecurityContext(ch.securityContext); tad.addComponent(rd, xpos, ypos+yShift, false,true); fromStart=new TGConnectorTMLAD(xpos, ypos, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>()); @@ -1509,7 +1517,7 @@ public class GTURTLEModeling { } TMLADReadChannel rd = new TMLADReadChannel(xc, 300, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad); rd.setChannelName("data_"+chan+"_"+hsmChannels.get(chan).task); - rd.securityContext = ch.securityContext; + rd.setSecurityContext(ch.securityContext); tad.addComponent(rd, xc,300,false,true); //Connect choice and readchannel fromStart = new TGConnectorTMLAD(xpos, ypos, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>()); @@ -1520,7 +1528,7 @@ public class GTURTLEModeling { TMLADWriteChannel wr = new TMLADWriteChannel(xc, 600, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad); wr.setChannelName("retData_"+chan+"_"+hsmChannels.get(chan).task); tad.addComponent(wr, xc, 600,false,true); - wr.securityContext = ch.securityContext; + wr.setSecurityContext(ch.securityContext); if (hsmChannels.get(chan).secType==HSMChannel.DEC){ @@ -1590,7 +1598,7 @@ public class GTURTLEModeling { HSMChannel ch = hsmChannels.get(chan); TMLADReadChannel rd = new TMLADReadChannel(xc, 300, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad); rd.setChannelName("data_"+chan+"_"+hsmChannels.get(chan).task); - rd.securityContext = ch.securityContext; + rd.setSecurityContext(ch.securityContext); tad.addComponent(rd, xc,300,false,true); //Connect choice and readchannel @@ -1603,7 +1611,7 @@ public class GTURTLEModeling { TMLADWriteChannel wr = new TMLADWriteChannel(xc, 600, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad); wr.setChannelName("retData_"+chan+"_"+hsmChannels.get(chan).task); tad.addComponent(wr, xc, 600,false,true); - wr.securityContext = ch.securityContext; + wr.setSecurityContext(ch.securityContext); if (hsmChannels.get(chan).secType==HSMChannel.DEC){ @@ -1739,7 +1747,7 @@ public class GTURTLEModeling { for (TGComponent tg: tad.getComponentList()){ if (tg instanceof TMLADReadChannel){ TMLADReadChannel readChannel = (TMLADReadChannel) tg; - if (readChannel.getChannelName().equals(chan) && readChannel.securityContext.equals("")){ + if (readChannel.getChannelName().equals(chan) && readChannel.getSecurityContext().equals("")){ fromStart = tad.findTGConnectorStartingAt(tg.getTGConnectingPointAtIndex(1)); if (fromStart!=null){ channelInstances.add(tg); @@ -1749,7 +1757,7 @@ public class GTURTLEModeling { } for (TGComponent chI: channelInstances){ TMLADReadChannel readChannel = (TMLADReadChannel) chI; - readChannel.securityContext=ch.securityContext; + readChannel.setSecurityContext(ch.securityContext); xpos = chI.getX(); ypos = chI.getY()+10; fromStart = tad.findTGConnectorStartingAt(chI.getTGConnectingPointAtIndex(1)); @@ -1794,7 +1802,7 @@ public class GTURTLEModeling { for (TGComponent tg: tad.getComponentList()){ if (tg instanceof TMLADWriteChannel){ TMLADWriteChannel writeChannel = (TMLADWriteChannel) tg; - if (writeChannel.getChannelName().equals(chan) && writeChannel.securityContext.equals("")){ + if (writeChannel.getChannelName().equals(chan) && writeChannel.getSecurityContext().equals("")){ fromStart = tad.findTGConnectorEndingAt(tg.getTGConnectingPointAtIndex(0)); if (fromStart!=null){ channelInstances.add(tg); @@ -1804,7 +1812,7 @@ public class GTURTLEModeling { } for (TGComponent chI: channelInstances){ TMLADWriteChannel writeChannel = (TMLADWriteChannel) chI; - writeChannel.securityContext=ch.securityContext; + writeChannel.setSecurityContext(ch.securityContext); xpos = chI.getX(); ypos = chI.getY()-10; fromStart = tad.findTGConnectorEndingAt(chI.getTGConnectingPointAtIndex(0)); @@ -1927,13 +1935,16 @@ public class GTURTLEModeling { } + + public TMLMapping<TGComponent> autoSecure(MainGUI gui, boolean autoConf, boolean autoWeakAuth, boolean autoStrongAuth){ //TODO add more options // if (tmap==null){ return null; } - int arch = gui.tabs.indexOf(tmap.tmlap); + TURTLEPanel tmlap = tmap.getCorrespondanceList().getTG(tmap.getArch().getFirstCPU()).getTDiagramPanel().tp; + int arch = gui.tabs.indexOf(tmlap); gui.cloneRenameTab(arch,"enc"); TMLArchiPanel newarch = (TMLArchiPanel) gui.tabs.get(gui.tabs.size()-1); @@ -1952,7 +1963,8 @@ public class GTURTLEModeling { if (tmap==null){ return null; } - int arch = gui.tabs.indexOf(tmap.tmlap); + TURTLEPanel tmlap = tmap.getCorrespondanceList().getTG(tmap.getArch().getFirstCPU()).getTDiagramPanel().tp; + int arch = gui.tabs.indexOf(tmlap); gui.cloneRenameTab(arch,"enc"); TMLArchiPanel newarch = (TMLArchiPanel) gui.tabs.get(gui.tabs.size()-1); return autoSecure(gui,"enc", tmap,newarch,encComp, overhead,decComp,true,false,false); @@ -1962,7 +1974,8 @@ public class GTURTLEModeling { if (tmap==null){ return null; } - int arch = gui.tabs.indexOf(tmap.tmlap); + TURTLEPanel tmlap = tmap.getCorrespondanceList().getTG(tmap.getArch().getFirstCPU()).getTDiagramPanel().tp; + int arch = gui.tabs.indexOf(tmlap); gui.cloneRenameTab(arch,"enc"); TMLArchiPanel newarch = (TMLArchiPanel) gui.tabs.get(gui.tabs.size()-1); return autoSecure(gui,"enc", tmap,newarch,encComp, overhead,decComp,autoConf,autoWeakAuth, autoStrongAuth); @@ -2056,8 +2069,9 @@ public class GTURTLEModeling { } //Create clone of Component Diagram + Activity diagrams to secure - - TMLComponentDesignPanel tmlcdp = map.getTMLCDesignPanel(); + TGComponent tgcomp= map.getTMLModeling().getTGComponent(); + TMLComponentDesignPanel tmlcdp= (TMLComponentDesignPanel) tgcomp.getTDiagramPanel().tp; +// TMLComponentDesignPanel tmlcdp = map.getTMLCDesignPanel(); int ind = gui.tabs.indexOf(tmlcdp); if (ind==-1){ TraceManager.addDev("No Component Design Panel"); @@ -2066,7 +2080,7 @@ public class GTURTLEModeling { String tabName = gui.getTitleAt(tmlcdp); gui.cloneRenameTab(ind, name); TMLComponentDesignPanel t = (TMLComponentDesignPanel) gui.tabs.get(gui.tabs.size()-1); - map.setTMLDesignPanel(t); + TMLComponentTaskDiagramPanel tcdp = t.tmlctdp; //Create clone of architecture panel and map tasks to it newarch.renameMapping(tabName, tabName+"_"+name); @@ -2100,7 +2114,7 @@ public class GTURTLEModeling { for (TGComponent tg:tad.getComponentList()){ if (tg instanceof TMLADWriteChannel){ TMLADWriteChannel writeChannel = (TMLADWriteChannel) tg; - if (writeChannel.securityContext.equals("")){ + if (writeChannel.getSecurityContext().equals("")){ TMLChannel chan = tmlmodel.getChannelByName(tabName+"__"+writeChannel.getChannelName()); //System.out.println("channel " + chan); @@ -2209,7 +2223,7 @@ public class GTURTLEModeling { for (TGComponent tg: tad.getComponentList()){ if (tg instanceof TMLADWriteChannel){ TMLADWriteChannel writeChannel = (TMLADWriteChannel) tg; - if (writeChannel.getChannelName().equals(channel) && writeChannel.securityContext.equals("")){ + if (writeChannel.getChannelName().equals(channel) && writeChannel.getSecurityContext().equals("")){ if (fromStart!=null){ channelInstances.add(tg); @@ -2237,7 +2251,7 @@ public class GTURTLEModeling { else { rd.setChannelName("nonceCh"+tmlc.getDestinationTask().getName().split("__")[1] + "_"+tmlc.getOriginTask().getName().split("__")[1]); } - rd.securityContext = "nonce_"+ tmlc.getDestinationTask().getName().split("__")[1] + "_"+tmlc.getOriginTask().getName().split("__")[1]; + rd.setSecurityContext("nonce_"+ tmlc.getDestinationTask().getName().split("__")[1] + "_"+tmlc.getOriginTask().getName().split("__")[1]); tad.addComponent(rd, xpos, ypos+yShift, false,true); fromStart.setP2(rd.getTGConnectingPointAtIndex(0)); fromStart=new TGConnectorTMLAD(enc.getX(), enc.getY(), tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>()); @@ -2271,9 +2285,9 @@ public class GTURTLEModeling { if (tg instanceof TMLADWriteChannel){ TMLADWriteChannel wChannel = (TMLADWriteChannel) tg; TraceManager.addDev("Inspecting write channel " + wChannel.getChannelName()); - if (channel.equals(wChannel.getChannelName()) && wChannel.securityContext.equals("")){ + if (channel.equals(wChannel.getChannelName()) && wChannel.getSecurityContext().equals("")){ TraceManager.addDev("Securing write channel " + wChannel.getChannelName()); - wChannel.securityContext = "autoEncrypt_"+wChannel.getChannelName(); + wChannel.setSecurityContext("autoEncrypt_"+wChannel.getChannelName()); } } @@ -2295,7 +2309,7 @@ public class GTURTLEModeling { for (TGComponent tg: tad.getComponentList()){ if (tg instanceof TMLADWriteChannel){ TMLADWriteChannel writeChannel = (TMLADWriteChannel) tg; - if (writeChannel.getChannelName().equals(channel) && writeChannel.securityContext.equals("")){ + if (writeChannel.getChannelName().equals(channel) && writeChannel.getSecurityContext().equals("")){ xpos = tg.getX(); ypos = tg.getY(); fromStart = tad.findTGConnectorEndingAt(tg.getTGConnectingPointAtIndex(0)); @@ -2327,7 +2341,7 @@ public class GTURTLEModeling { else { rd.setChannelName("nonceCh"+tmlc.getDestinationTask().getName().split("__")[1] + "_"+tmlc.getOriginTask().getName().split("__")[1]); } - rd.securityContext = "nonce_"+ tmlc.getDestinationTask().getName().split("__")[1] + "_"+tmlc.getOriginTask().getName().split("__")[1]; + rd.setSecurityContext("nonce_"+ tmlc.getDestinationTask().getName().split("__")[1] + "_"+tmlc.getOriginTask().getName().split("__")[1]); tad.addComponent(rd, xpos, ypos+yShift, false,true); fromStart.setP2(rd.getTGConnectingPointAtIndex(0)); fromStart=new TGConnectorTMLAD(enc.getX(), enc.getY(), tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>()); @@ -2364,9 +2378,9 @@ public class GTURTLEModeling { if (tg instanceof TMLADWriteChannel){ TMLADWriteChannel wChannel = (TMLADWriteChannel) tg; TraceManager.addDev("Inspecting write channel " + wChannel.getChannelName()); - if (channel.equals(wChannel.getChannelName()) && wChannel.securityContext.equals("")){ + if (channel.equals(wChannel.getChannelName()) && wChannel.getSecurityContext().equals("")){ TraceManager.addDev("Securing write channel " + wChannel.getChannelName()); - wChannel.securityContext = "autoEncrypt_"+wChannel.getChannelName(); + wChannel.setSecurityContext("autoEncrypt_"+wChannel.getChannelName()); tad.repaint(); } } @@ -2388,7 +2402,7 @@ public class GTURTLEModeling { for (TGComponent tg: tad.getComponentList()){ if (tg instanceof TMLADReadChannel){ TMLADReadChannel readChannel = (TMLADReadChannel) tg; - if (readChannel.getChannelName().equals(channel) && readChannel.securityContext.equals("")){ + if (readChannel.getChannelName().equals(channel) && readChannel.getSecurityContext().equals("")){ fromStart = tad.findTGConnectorEndingAt(tg.getTGConnectingPointAtIndex(0)); if (fromStart!=null){ channelInstances.add(tg); @@ -2410,7 +2424,7 @@ public class GTURTLEModeling { TMLADReadChannel readChannel = (TMLADReadChannel) comp; TraceManager.addDev("Securing read channel " + readChannel.getChannelName()); - readChannel.securityContext = "autoEncrypt_"+readChannel.getChannelName(); + readChannel.setSecurityContext("autoEncrypt_"+readChannel.getChannelName()); tad.repaint(); TMLADWriteChannel wr = new TMLADWriteChannel(0, 0, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad); @@ -2439,7 +2453,7 @@ public class GTURTLEModeling { wr.setChannelName("nonceCh"+tmlc.getDestinationTask().getName().split("__")[1] + "_"+tmlc.getOriginTask().getName().split("__")[1]); } //send the nonce along the channel - wr.securityContext = "nonce_"+tmlc.getDestinationTask().getName().split("__")[1] + "_"+tmlc.getOriginTask().getName().split("__")[1]; + wr.setSecurityContext("nonce_"+tmlc.getDestinationTask().getName().split("__")[1] + "_"+tmlc.getOriginTask().getName().split("__")[1]); tad.addComponent(wr,xpos,ypos+yShift,false,true); wr.makeValue(); TGConnector tmp =new TGConnectorTMLAD(wr.getX(), wr.getY()+yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null,tad,nonce.getTGConnectingPointAtIndex(1), wr.getTGConnectingPointAtIndex(0), new Vector<Point>()); @@ -2475,9 +2489,9 @@ public class GTURTLEModeling { if (tg instanceof TMLADReadChannel){ readChannel = (TMLADReadChannel) tg; TraceManager.addDev("Inspecting read channel " + readChannel.getChannelName()); - if (channel.equals(readChannel.getChannelName()) && readChannel.securityContext.equals("")){ + if (channel.equals(readChannel.getChannelName()) && readChannel.getSecurityContext().equals("")){ TraceManager.addDev("Securing read channel " + readChannel.getChannelName()); - readChannel.securityContext = "autoEncrypt_"+readChannel.getChannelName(); + readChannel.setSecurityContext("autoEncrypt_"+readChannel.getChannelName()); } } @@ -2505,7 +2519,7 @@ public class GTURTLEModeling { for (TGComponent tg: tad.getComponentList()){ if (tg instanceof TMLADReadChannel){ readChannel = (TMLADReadChannel) tg; - if (readChannel.getChannelName().equals(channel) && readChannel.securityContext.equals("")){ + if (readChannel.getChannelName().equals(channel) && readChannel.getSecurityContext().equals("")){ fromStart = tad.findTGConnectorEndingAt(tg.getTGConnectingPointAtIndex(0)); if (fromStart!=null){ channelInstances.add(tg); @@ -2546,7 +2560,7 @@ public class GTURTLEModeling { wr.setChannelName("nonceCh"+tmlc.getDestinationTask().getName().split("__")[1] + "_"+tmlc.getOriginTask().getName().split("__")[1]); } //send the nonce along the channel - wr.securityContext = "nonce_"+tmlc.getDestinationTask().getName().split("__")[1] + "_"+tmlc.getOriginTask().getName().split("__")[1]; + wr.setSecurityContext("nonce_"+tmlc.getDestinationTask().getName().split("__")[1] + "_"+tmlc.getOriginTask().getName().split("__")[1]); tad.addComponent(wr,xpos,ypos+yShift,false,true); wr.makeValue(); TGConnector tmp =new TGConnectorTMLAD(wr.getX(), wr.getY()+yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null,tad,nonce.getTGConnectingPointAtIndex(1), wr.getTGConnectingPointAtIndex(0), new Vector<Point>()); @@ -2568,7 +2582,7 @@ public class GTURTLEModeling { //Now add the decrypt operator yShift=40; TraceManager.addDev("Securing read channel " + readChannel.getChannelName()); - readChannel.securityContext = "autoEncrypt_"+readChannel.getChannelName(); + readChannel.setSecurityContext("autoEncrypt_"+readChannel.getChannelName()); tad.repaint(); //Add decryption operator if it does not already exist xpos = readChannel.getX(); @@ -2588,9 +2602,9 @@ public class GTURTLEModeling { if (tg instanceof TMLADReadChannel){ readChannel = (TMLADReadChannel) tg; TraceManager.addDev("Inspecting read channel " + readChannel.getChannelName()); - if (channel.equals(readChannel.getChannelName()) && readChannel.securityContext.equals("")){ + if (channel.equals(readChannel.getChannelName()) && readChannel.getSecurityContext().equals("")){ TraceManager.addDev("Securing read channel " + readChannel.getChannelName()); - readChannel.securityContext = "autoEncrypt_"+readChannel.getChannelName(); + readChannel.setSecurityContext("autoEncrypt_"+readChannel.getChannelName()); } } @@ -2627,6 +2641,8 @@ public class GTURTLEModeling { map.setTMLModeling(newmodel); return map; } + + public boolean securePath(TMLMapping<TGComponent> map, TMLTask t1, TMLTask t2){ //Check if a path between two tasks is secure boolean secure=true; @@ -2772,7 +2788,7 @@ public class GTURTLEModeling { else { System.out.println("Can't map key to memory for " + sp.name + " on task " + t.getName()); UICheckingError ce = new UICheckingError(CheckingError.STRUCTURE_ERROR, "Cannot map key in memory for " + sp.name + " on task " + t.getName()); - ce.setTDiagramPanel(tmap.tmlap.tmlap); + ce.setTDiagramPanel(tmap.getCorrespondanceList().getTG(tmap.getArch().getFirstCPU()).getTDiagramPanel()); ce.setTGComponent(null); checkingErrors.add(ce); } @@ -2813,7 +2829,7 @@ public class GTURTLEModeling { else if (tmlm!=null){ //Generate default mapping tmap = tmlm.getDefaultMapping(); - tmap.setTMLDesignPanel((TMLComponentDesignPanel)mgui.getCurrentTURTLEPanel()); + t2a=new TML2Avatar(tmap,false,true); avatarspec = t2a.generateAvatarSpec(loopLimit); } diff --git a/src/main/java/ui/MainGUI.java b/src/main/java/ui/MainGUI.java index 54cb74a400525e6cd35b5a394a1f26ef4d9aa95c..fe7f83a8485c0dc0d8bb649348d563edf8db4094 100644 --- a/src/main/java/ui/MainGUI.java +++ b/src/main/java/ui/MainGUI.java @@ -3601,9 +3601,29 @@ public class MainGUI implements ActionListener, WindowListener, KeyListener, Pe if (!(tp instanceof TMLComponentDesignPanel)) { return null;} TMLComponentDesignPanel tmlcomp = (TMLComponentDesignPanel)tp; String name = getCurrentTDiagramPanel().getName(); + System.out.println("Name " + name); return tmlcomp.getAllOutChannels(name); } + + public String[] getAllCompOutChannels() { //this routine can be called only from a TMLComponentDesignPanel + List<String> chans = new ArrayList<String>(); + TURTLEPanel tp = getCurrentTURTLEPanel(); + if (tp == null) { return null;} + if (!(tp instanceof TMLComponentDesignPanel)) { return null;} + TMLComponentDesignPanel tmlcomp = (TMLComponentDesignPanel)tp; + return tmlcomp.getCompOutChannels(); + } + + public String[] getAllCompInChannels() { //this routine can be called only from a TMLComponentDesignPanel + TURTLEPanel tp = getCurrentTURTLEPanel(); + if (tp == null) { return null;} + if (!(tp instanceof TMLComponentDesignPanel)) { return null;} + TMLComponentDesignPanel tmlcomp = (TMLComponentDesignPanel)tp; + return tmlcomp.getCompInChannels(); + } + + public String[] getAllInChannels() { //this routine can be called only from a TMLComponentDesignPanel TURTLEPanel tp = getCurrentTURTLEPanel(); if (tp == null) {return null;} diff --git a/src/main/java/ui/TDiagramPanel.java b/src/main/java/ui/TDiagramPanel.java index e3bae696c2d6f08d4f91c3d3f571ea18bdd4f82c..6243f0997d1d861c684930dec30c32831dd7f4d3 100755 --- a/src/main/java/ui/TDiagramPanel.java +++ b/src/main/java/ui/TDiagramPanel.java @@ -2147,6 +2147,7 @@ public abstract class TDiagramPanel extends JPanel implements GenericTree { actionOnRemove(t); tgcon.getTGConnectingPointP1().setFree(true); tgcon.getTGConnectingPointP2().setFree(true); + System.out.println("removing..."); TraceManager.addDev("Removed one connector!"); for(int k=0; k<tgcon.getNbConnectingPoint(); k++) removeOneConnector(tgcon.tgconnectingPointAtIndex(k)); diff --git a/src/main/java/ui/TMLComponentDesignPanel.java b/src/main/java/ui/TMLComponentDesignPanel.java index dc16ff5937c9c3d17f1775dc95049d5a9d01cb44..28b63c05cdd61ce955eb91a0c32c8e3bd7763c9a 100755 --- a/src/main/java/ui/TMLComponentDesignPanel.java +++ b/src/main/java/ui/TMLComponentDesignPanel.java @@ -94,6 +94,8 @@ public class TMLComponentDesignPanel extends TURTLEPanel { tabbedPane.setTabLayoutPolicy( JTabbedPane.SCROLL_TAB_LAYOUT ); } + + public TMLActivityDiagramPanel getTMLActivityDiagramPanel(String _name) { TMLActivityDiagramPanel tmladp; for(int i=1; i<panels.size(); i++) { @@ -193,6 +195,14 @@ public class TMLComponentDesignPanel extends TURTLEPanel { return tmlctdp.getPrimitiveComponentByName(_name); } + public String[] getCompOutChannels(){ + return tmlctdp.getCompOutChannels(); + } + + public String[] getCompInChannels(){ + return tmlctdp.getCompInChannels(); + } + public java.util.List<String> getAllTMLCommunicationNames(String _name) { return tmlctdp.getAllTMLCommunicationNames(_name); } diff --git a/src/main/java/ui/tmlad/TMLADReadChannel.java b/src/main/java/ui/tmlad/TMLADReadChannel.java index 3bedd32867fdcafbfe1b594c9f86659c221ca2c3..c3d37e110701516b909406a98abb031b424931d7 100755 --- a/src/main/java/ui/tmlad/TMLADReadChannel.java +++ b/src/main/java/ui/tmlad/TMLADReadChannel.java @@ -79,7 +79,9 @@ public class TMLADReadChannel extends TGCWithoutInternalComponent implements Che protected String channelName = "ch"; protected String nbOfSamples= "1"; - public String securityContext =""; + protected String securityContext =""; + protected boolean isAttacker=false; + protected int stateOfError = 0; // Not yet checked public final static int NOT_VERIFIED = 0; @@ -169,8 +171,12 @@ public class TMLADReadChannel extends TGCWithoutInternalComponent implements Che g.drawLine(x, y+height, x+width, y+height); g.drawLine(x, y, x+linebreak, y+height/2); g.drawLine(x, y+height, x+linebreak, y+height/2); - - g.drawString("chl", x+(width-w) / 2, y+textY0); + if (isAttacker){ + g.drawString("attack", x+(width-w) / 2, y+textY0); + } + else { + g.drawString("chl", x+(width-w) / 2, y+textY0); + } g.drawString(value, x + linebreak + textX0, y + textY1); if (!securityContext.equals("")){ @@ -258,25 +264,32 @@ public class TMLADReadChannel extends TGCWithoutInternalComponent implements Che public boolean editOndoubleClick(JFrame frame) { - String [] labels = new String[3]; - String [] values = new String[3]; + String [] labels = new String[4]; + String [] values = new String[4]; labels[0] = "Channel name"; values[0] = channelName; - labels[1] = "Nb of samples"; + labels[1] = "Nb of samples"; values[1] = nbOfSamples; labels[2] = "Security Pattern"; - values[2] = securityContext; + values[2] = securityContext; + labels[3] = "Attacker?"; + values[3] = isAttacker ? "Yes" : "No"; ArrayList<String []> help = new ArrayList<String []>(); - String[] allInChannels = tdp.getMGUI().getAllInChannels(); - help.add(allInChannels); - help.add(null); - help.add(tdp.getMGUI().getCurrentCryptoConfig()); - + String[] allInChannels = tdp.getMGUI().getAllInChannels(); + System.out.println("isAttacker "+ isAttacker); + if (isAttacker){ + allInChannels = tdp.getMGUI().getAllCompInChannels(); + } + help.add(allInChannels); + help.add(null); + help.add(tdp.getMGUI().getCurrentCryptoConfig()); + String[] choice = new String[]{"Yes", "No"}; + help.add(choice); // JDialogTwoString jdts = new JDialogTwoString(frame, "Setting channel's properties", "Channel name", channelName, "Nb of samples", nbOfSamples); - JDialogMultiString jdms = new JDialogMultiString(frame, "Setting channel's properties", 3, labels, values, help); + JDialogMultiString jdms = new JDialogMultiString(frame, "Setting channel's properties", 4, labels, values, help); //jdms.setSize(600, 300); GraphicLib.centerOnParent(jdms, 600, 300); jdms.setVisible( true ); // blocked until dialog has been closed @@ -284,7 +297,8 @@ public class TMLADReadChannel extends TGCWithoutInternalComponent implements Che if (jdms.hasBeenSet() && (jdms.hasValidString(0))) { channelName = jdms.getString(0); nbOfSamples = jdms.getString(1); - securityContext = jdms.getString(2); + securityContext = jdms.getString(2); + isAttacker=jdms.getString(3).equals("Yes"); makeValue(); return true; } @@ -316,6 +330,8 @@ public class TMLADReadChannel extends TGCWithoutInternalComponent implements Che sb.append(getSamplesValue()); sb.append("\" secPattern=\""); sb.append(securityContext); + sb.append("\" isAttacker=\""); + sb.append(isAttacker ? "Yes": "No"); sb.append("\" />\n"); sb.append("</extraparam>\n"); return new String(sb); @@ -347,6 +363,7 @@ public class TMLADReadChannel extends TGCWithoutInternalComponent implements Che channelName = elt.getAttribute("channelName"); nbOfSamples = elt.getAttribute("nbOfSamples"); securityContext = elt.getAttribute("secPattern"); + isAttacker = elt.getAttribute("isAttacker").equals("Yes"); } } } @@ -360,6 +377,18 @@ public class TMLADReadChannel extends TGCWithoutInternalComponent implements Che } + public String getSecurityContext(){ + return securityContext; + } + + public void setSecurityContext(String sc){ + securityContext=sc; + } + + public boolean isAttacker(){ + return isAttacker; + } + public int getType() { return TGComponentManager.TMLAD_READ_CHANNEL; } diff --git a/src/main/java/ui/tmlad/TMLADWriteChannel.java b/src/main/java/ui/tmlad/TMLADWriteChannel.java index 6bd275a8387cb2ce7d1244e7bdd48a043c108d18..a15f95ec63e7fb7d3d6a224397d45d65f8684b83 100755 --- a/src/main/java/ui/tmlad/TMLADWriteChannel.java +++ b/src/main/java/ui/tmlad/TMLADWriteChannel.java @@ -83,7 +83,9 @@ public class TMLADWriteChannel extends TGCWithoutInternalComponent implements Ch protected String channelName = "ch"; protected String nbOfSamples= "1"; - public String securityContext = ""; + protected String securityContext = ""; + protected boolean isAttacker = false; + protected int stateOfError = 0; // Not yet checked public final static int NOT_VERIFIED = 0; @@ -168,8 +170,12 @@ public class TMLADWriteChannel extends TGCWithoutInternalComponent implements Ch g.drawLine(x, y, x, y+height); g.drawLine(x+width-linebreak, y, x+width, y+height/2); g.drawLine(x+width-linebreak, y+height, x+width, y+height/2); - - g.drawString("chl", x+(width-w) / 2, y); + if (isAttacker){ + g.drawString("attack", x+(width-w) / 2, y); + } + else { + g.drawString("chl", x+(width-w) / 2, y); + } g.drawString(value, x + (width - w) / 2 , y + textY); if (!securityContext.equals("")){ g.drawString("sec:"+securityContext, x+3*width/4, y+height+textY); @@ -271,23 +277,30 @@ public class TMLADWriteChannel extends TGCWithoutInternalComponent implements Ch } public boolean editOndoubleClick(JFrame frame) { - String [] labels = new String[3]; - String [] values = new String[3]; + String [] labels = new String[4]; + String [] values = new String[4]; labels[0] = "Channel name"; values[0] = channelName; labels[1] = "Nb of samples"; values[1] = nbOfSamples; labels[2] = "Security Pattern"; values[2] = securityContext; - + labels[3] = "Attacker?"; + values[3] = isAttacker ? "Yes" : "No"; ArrayList<String []> help = new ArrayList<String []>(); String[] allOutChannels = tdp.getMGUI().getAllOutChannels(); + System.out.println("isAttacker "+ isAttacker); + if (isAttacker){ + allOutChannels =tdp.getMGUI().getAllCompOutChannels(); + } + String[] choice = new String[]{"Yes", "No"}; help.add(allOutChannels); help.add(null); help.add(tdp.getMGUI().getCurrentCryptoConfig()); + help.add(choice); //JDialogTwoString jdts = new JDialogTwoString(frame, "Setting channel's properties", "Channel name", channelName, "Nb of samples", nbOfSamples); - JDialogMultiString jdms = new JDialogMultiString(frame, "Setting channel's properties", 3, labels, values, help); + JDialogMultiString jdms = new JDialogMultiString(frame, "Setting channel's properties", 4, labels, values, help); //jdms.setSize(600, 300); GraphicLib.centerOnParent(jdms, 600, 300); jdms.setVisible( true ); // blocked until dialog has been closed @@ -295,8 +308,8 @@ public class TMLADWriteChannel extends TGCWithoutInternalComponent implements Ch if (jdms.hasBeenSet() && (jdms.hasValidString(0))) { channelName = jdms.getString(0); nbOfSamples = jdms.getString(1); - securityContext = jdms.getString(2); - + securityContext = jdms.getString(2); + isAttacker=jdms.getString(3).equals("Yes"); makeValue(); return true; } @@ -313,6 +326,8 @@ public class TMLADWriteChannel extends TGCWithoutInternalComponent implements Ch sb.append(getSamplesValue()); sb.append("\" secPattern=\""); sb.append(securityContext); + sb.append("\" isAttacker=\""); + sb.append(isAttacker ? "Yes": "No"); sb.append("\" />\n"); sb.append("</extraparam>\n"); return new String(sb); @@ -344,6 +359,7 @@ public class TMLADWriteChannel extends TGCWithoutInternalComponent implements Ch channelName = elt.getAttribute("channelName"); nbOfSamples = elt.getAttribute("nbOfSamples"); securityContext = elt.getAttribute("secPattern"); + isAttacker = elt.getAttribute("isAttacker").equals("Yes"); } } } @@ -375,6 +391,20 @@ public class TMLADWriteChannel extends TGCWithoutInternalComponent implements Ch nbOfSamples=sp; makeValue(); } + + public String getSecurityContext(){ + return securityContext; + } + + public void setSecurityContext(String sc){ + securityContext=sc; + } + + + public boolean isAttacker(){ + return isAttacker; + } + public void setStateAction(int _stateAction) { stateOfError = _stateAction; } diff --git a/src/main/java/ui/tmlcompd/TMLCPrimitiveComponent.java b/src/main/java/ui/tmlcompd/TMLCPrimitiveComponent.java index 5694e357c1e93fd23cfdae2d0a2920f65eaf8a5c..2ad6c2408ebea30c19867518afe0efbd90d76046 100755 --- a/src/main/java/ui/tmlcompd/TMLCPrimitiveComponent.java +++ b/src/main/java/ui/tmlcompd/TMLCPrimitiveComponent.java @@ -201,7 +201,7 @@ public class TMLCPrimitiveComponent extends TGCScalableWithInternalComponent imp iconIsDrawn = false; } if (isAttacker){ - g.drawImage(IconManager.imgic8.getImage(), x + width - iconSize - textX, y + 2*textX, null); + g.drawImage(IconManager.imgic7008.getImage(), x + width - iconSize - textX, y + 2*textX, null); } // Attributes @@ -497,6 +497,9 @@ public class TMLCPrimitiveComponent extends TGCScalableWithInternalComponent imp //TraceManager.addDev("Loading extra params of " + value); //value = ""; StringBuffer sb = new StringBuffer("<extraparam>\n"); + sb.append("<Data isAttacker=\""); + sb.append(isAttacker() ? "Yes": "No"); + sb.append("\" />\n"); for(int i=0; i<myAttributes.size(); i++) { //TraceManager.addDev("Attribute:" + i); a = myAttributes.get (i); @@ -541,6 +544,9 @@ public class TMLCPrimitiveComponent extends TGCScalableWithInternalComponent imp //TraceManager.addDev(n2); if (n2.getNodeType() == Node.ELEMENT_NODE) { elt = (Element) n2; + if (elt.getTagName().equals("Data")) { + isAttacker = elt.getAttribute("isAttacker").equals("Yes"); + } if (elt.getTagName().equals("Attribute")) { //TraceManager.addDev("Analyzing attribute"); access = Integer.decode(elt.getAttribute("access")).intValue(); diff --git a/src/main/java/ui/tmlcompd/TMLComponentTaskDiagramPanel.java b/src/main/java/ui/tmlcompd/TMLComponentTaskDiagramPanel.java index cf009a9a305ef17efeccfca9bf4797c66940c1a1..5e367a054b60a5ccc8ca606e2eb82eca4d4744da 100755 --- a/src/main/java/ui/tmlcompd/TMLComponentTaskDiagramPanel.java +++ b/src/main/java/ui/tmlcompd/TMLComponentTaskDiagramPanel.java @@ -145,6 +145,29 @@ public class TMLComponentTaskDiagramPanel extends TDiagramPanel implements TDPWi return true; } + public List<TMLCPrimitivePort> getPortsByName(String name){ + List<TMLCPrimitivePort> ports = new ArrayList<TMLCPrimitivePort>(); + for (TGComponent tgc : componentList){ + + if (tgc instanceof TMLCPrimitiveComponent){ + TMLCPrimitiveComponent comp = (TMLCPrimitiveComponent) tgc; + List<TMLCPrimitivePort> cps = comp.getAllChannelsOriginPorts(); + for (TMLCPrimitivePort port : cps){ + if (port.commName.equals(name)){ + ports.add(port); + } + } + cps = comp.getAllChannelsDestinationPorts(); + for (TMLCPrimitivePort port : cps){ + if (port.commName.equals(name)){ + ports.add(port); + } + } + } + } + return ports; + } + public boolean actionOnValueChanged(TGComponent tgc) { //System.out.println("Action on value changed on component:" + tgc); if (tgc instanceof TMLCPrimitiveComponent) { @@ -445,6 +468,8 @@ public class TMLComponentTaskDiagramPanel extends TDiagramPanel implements TDPWi return al; } + + public void getAllPortsConnectedTo( List<TGComponent> ll, TMLCPrimitivePort _port) { List<TGComponent> components = getMGUI().getAllTMLComponents(); Iterator<TGComponent> iterator = components.listIterator(); @@ -618,6 +643,55 @@ public class TMLComponentTaskDiagramPanel extends TDiagramPanel implements TDPWi } } + public String[] getCompOutChannels(){ + List<String> chls = new ArrayList<String>(); + TGComponent tgc; + Iterator<TGComponent> iterator = componentList.listIterator(); + // List<String> list = new ArrayList<String>(); + TMLCPrimitiveComponent tmp; + + while(iterator.hasNext()) { + tgc = iterator.next(); + if (tgc instanceof TMLCPrimitiveComponent) { + TMLCPrimitiveComponent comp = (TMLCPrimitiveComponent) tgc; + List<TMLCPrimitivePort> ll = comp.getAllChannelsOriginPorts(); + Iterator<TMLCPrimitivePort> ite = ll.listIterator(); + while(ite.hasNext()) { + TMLCPrimitivePort port = ite.next(); + chls.add(port.getPortName()); + } + } + } + String[] chlArray = new String[chls.size()]; + chlArray = chls.toArray(chlArray); + return chlArray; + } + + public String[] getCompInChannels(){ + List<String> chls = new ArrayList<String>(); + TGComponent tgc; + Iterator<TGComponent> iterator = componentList.listIterator(); + // List<String> list = new ArrayList<String>(); + TMLCPrimitiveComponent tmp; + + while(iterator.hasNext()) { + tgc = iterator.next(); + if (tgc instanceof TMLCPrimitiveComponent) { + TMLCPrimitiveComponent comp = (TMLCPrimitiveComponent) tgc; + List<TMLCPrimitivePort> ll = comp.getAllChannelsDestinationPorts(); + Iterator<TMLCPrimitivePort> ite = ll.listIterator(); + while(ite.hasNext()) { + TMLCPrimitivePort port = ite.next(); + chls.add(port.getPortName()); + } + } + } + String[] chlArray = new String[chls.size()]; + chlArray = chls.toArray(chlArray); + return chlArray; + } + + public TMLCPrimitiveComponent getPrimitiveComponentByName(String _name) { TGComponent tgc; Iterator<TGComponent> iterator = componentList.listIterator(); diff --git a/src/main/java/ui/util/DefaultText.java b/src/main/java/ui/util/DefaultText.java index dd50e2284bfefc7d7829136cca08bcaedec62f7b..6cb3c07d5e636ccd5f531a9305087ffd744d878c 100755 --- a/src/main/java/ui/util/DefaultText.java +++ b/src/main/java/ui/util/DefaultText.java @@ -51,8 +51,8 @@ package ui.util; */ public class DefaultText { - public static String BUILD = "12339"; - public static String DATE = "2017/08/21 13:41:47 CET"; + public static String BUILD = "12356"; + public static String DATE = "2017/09/07 02:01:14 CET"; public static StringBuffer sbAbout = makeAbout(); diff --git a/src/main/java/ui/util/IconManager.java b/src/main/java/ui/util/IconManager.java index 1c3f9a88e14c5af8b28ba983572c305a981f98e6..2af58c41e42580c510d0e746ee91215d07711c73 100755 --- a/src/main/java/ui/util/IconManager.java +++ b/src/main/java/ui/util/IconManager.java @@ -158,6 +158,8 @@ public class IconManager { public static ImageIcon imgic7002, imgic7003, imgic7004, imgic7005, imgic7006; //Show traces public static ImageIcon imgic7007; + //Attacker Scenarios + public static ImageIcon imgic7008; // Delegate ports image removed, by Solange //public static ImageIcon imgic2102; @@ -605,6 +607,10 @@ public class IconManager { private static String icon7006 = "imply.gif"; //Show traces private static String icon7007 = "toolbarButtonGraphics/general/showTrace.gif"; + + //Attacker Scenarios + private static String icon7008 = "attacker.gif"; + public IconManager() { @@ -1026,6 +1032,7 @@ public class IconManager { imgic7005 = getIcon(icon7005); imgic7006 = getIcon(icon7006); imgic7007 = getIcon(icon7007); + imgic7008 = getIcon(icon7008); } } // Class diff --git a/src/main/resources/ui/util/attacker.gif b/src/main/resources/ui/util/attacker.gif new file mode 100755 index 0000000000000000000000000000000000000000..63df12723915609815223e04b0f5e4fd0d53ed04 Binary files /dev/null and b/src/main/resources/ui/util/attacker.gif differ