X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=sim%2Fucsim%2Fsim.src%2Fhw.cc;fp=sim%2Fucsim%2Fsim.src%2Fhw.cc;h=45fa705917f79395f886770e6e7c07bcac6ffc40;hb=f27da39dbcab5678aca6d8462f1cc37a643f37e9;hp=167c1cad9527210d3dae1604d639d9bfc851fe06;hpb=7fe573ea83f6e0762dc73bc493f15fa2a8f6273d;p=fw%2Fsdcc diff --git a/sim/ucsim/sim.src/hw.cc b/sim/ucsim/sim.src/hw.cc index 167c1cad..45fa7059 100644 --- a/sim/ucsim/sim.src/hw.cc +++ b/sim/ucsim/sim.src/hw.cc @@ -38,8 +38,8 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA *____________________________________________________________________________ */ -cl_watched_cell::cl_watched_cell(class cl_mem *amem, t_addr aaddr, - class cl_cell **astore, +cl_watched_cell::cl_watched_cell(class cl_address_space *amem, t_addr aaddr, + class cl_memory_cell **astore, enum what_to_do_on_cell_change awtd) { mem= amem; @@ -55,7 +55,7 @@ cl_watched_cell::cl_watched_cell(class cl_mem *amem, t_addr aaddr, } void -cl_watched_cell::mem_cell_changed(class cl_mem *amem, t_addr aaddr, +cl_watched_cell::mem_cell_changed(class cl_address_space *amem, t_addr aaddr, class cl_hw *hw) { if (mem && @@ -74,8 +74,14 @@ cl_watched_cell::mem_cell_changed(class cl_mem *amem, t_addr aaddr, } } -/*void -cl_used_cell::mem_cell_changed(class cl_mem *amem, t_addr aaddr, +void +cl_watched_cell::address_space_added(class cl_address_space *amem, + class cl_hw *hw) +{ +} + +void +cl_used_cell::mem_cell_changed(class cl_address_space *amem, t_addr aaddr, class cl_hw *hw) { if (mem && @@ -92,7 +98,13 @@ class cl_hw *hw) hw->write(cell, &d); } } -}*/ +} + +void +cl_used_cell::address_space_added(class cl_address_space *amem, + class cl_hw *hw) +{ +} /* @@ -111,8 +123,12 @@ cl_hw::cl_hw(class cl_uc *auc, enum hw_cath cath, int aid, char *aid_string): id_string= strdup(aid_string); else id_string= strdup("unknown hw element"); - partners= new cl_list(2, 2); - watched_cells= new cl_list(2, 2); + char *s= (char*)malloc(strlen(get_name("hw"))+100); + sprintf(s, "partners of %s", get_name("hw")); + partners= new cl_list(2, 2, s); + sprintf(s, "watched cells of %s", get_name("hw")); + watched_cells= new cl_list(2, 2, s); + free(s); } cl_hw::~cl_hw(void) @@ -159,43 +175,52 @@ cl_hw::make_partner(enum hw_cath cath, int id) */ /*t_mem -cl_hw::read(class cl_mem *mem, t_addr addr) +cl_hw::read(class cl_m *mem, t_addr addr) { // Simply return the value return(mem->get(addr)); }*/ /*void -cl_hw::write(class cl_mem *mem, t_addr addr, t_mem *val) +cl_hw::write(class cl_m *mem, t_addr addr, t_mem *val) { // Do not change *val by default }*/ +void +cl_hw::set_cmd(class cl_cmdline *cmdline, class cl_console *con) +{ + con->dd_printf("Nothing to do\n"); +} -class cl_cell * -cl_hw::register_cell(class cl_mem *mem, t_addr addr, class cl_cell **store, +class cl_memory_cell * +cl_hw::register_cell(class cl_address_space *mem, t_addr addr, + class cl_memory_cell **store, enum what_to_do_on_cell_change awtd) { class cl_watched_cell *wc; - class cl_cell *cell; + class cl_memory_cell *cell; if (mem) mem->register_hw(addr, this, (int*)0, DD_FALSE); + else + printf("regcell JAJ no mem\n"); wc= new cl_watched_cell(mem, addr, &cell, awtd); if (store) *store= cell; watched_cells->add(wc); // announce - uc->sim->mem_cell_changed(mem, addr); + //uc->sim->mem_cell_changed(mem, addr); return(cell); } -class cl_cell * -cl_hw::use_cell(class cl_mem *mem, t_addr addr, class cl_cell **store, +class cl_memory_cell * +cl_hw::use_cell(class cl_address_space *mem, t_addr addr, + class cl_memory_cell **store, enum what_to_do_on_cell_change awtd) { class cl_watched_cell *wc; - class cl_cell *cell; + class cl_memory_cell *cell; wc= new cl_used_cell(mem, addr, &cell, awtd); if (store) @@ -205,7 +230,7 @@ cl_hw::use_cell(class cl_mem *mem, t_addr addr, class cl_cell **store, } void -cl_hw::mem_cell_changed(class cl_mem *mem, t_addr addr) +cl_hw::mem_cell_changed(class cl_address_space *mem, t_addr addr) { int i; @@ -217,6 +242,19 @@ cl_hw::mem_cell_changed(class cl_mem *mem, t_addr addr) } } +void +cl_hw::address_space_added(class cl_address_space *as) +{ + int i; + + for (i= 0; i < watched_cells->count; i++) + { + class cl_watched_cell *wc= + dynamic_cast(watched_cells->object_at(i)); + wc->address_space_added(as, this); + } +} + /* * Simulating `cycles' number of machine cycle @@ -274,7 +312,7 @@ cl_hws::add(void *item) void -cl_hws::mem_cell_changed(class cl_mem *mem, t_addr addr) +cl_hws::mem_cell_changed(class cl_address_space *mem, t_addr addr) { int i; @@ -285,6 +323,18 @@ cl_hws::mem_cell_changed(class cl_mem *mem, t_addr addr) } } +void +cl_hws::address_space_added(class cl_address_space *mem) +{ + int i; + + for (i= 0; i < count; i++) + { + class cl_hw *hw= (class cl_hw *)(at(i)); + hw->address_space_added(mem); + } +} + /* *____________________________________________________________________________